{
}
})
- it('opens while streaming with Thinking… label and scrollable body', () => {
+ it('opens while streaming with Thinking label and scrollable body', () => {
const { container, unmount } = renderChrome({
thinking: 'step one',
isStreaming: true,
@@ -94,7 +94,7 @@ describe('AgentStreamThinkingChrome', () => {
) as HTMLDivElement
expect(toggle.getAttribute('aria-expanded')).toBe('true')
- expect(toggle.textContent).toContain('Thinking…')
+ expect(toggle.textContent).toContain('Thinking')
expect(
container
.querySelector('[data-testid="agent-stream-thinking-label"]')
@@ -185,7 +185,7 @@ describe('AgentStreamThinkingChrome', () => {
rerender({ thinking: 'first then more', isStreaming: true })
expect(toggle.getAttribute('aria-expanded')).toBe('true')
- expect(toggle.textContent).toContain('Thinking…')
+ expect(toggle.textContent).toContain('Thinking')
})
})
diff --git a/apps/sim/components/agent-stream/agent-stream-chrome.tsx b/apps/sim/components/agent-stream/agent-stream-chrome.tsx
index 3e264f716ef..ed91d7d1ae1 100644
--- a/apps/sim/components/agent-stream/agent-stream-chrome.tsx
+++ b/apps/sim/components/agent-stream/agent-stream-chrome.tsx
@@ -113,7 +113,7 @@ export function AgentStreamThinkingChrome({
setOverflowing(el.scrollHeight > el.clientHeight + 1)
}
- const label = isStreaming ? 'Thinking…' : 'Thought for a moment'
+ const label = isStreaming ? 'Thinking' : 'Thought for a moment'
return (
diff --git a/apps/sim/components/ui/shimmer-text.tsx b/apps/sim/components/ui/shimmer-text.tsx
index 56f2b37662c..0b6bc621a85 100644
--- a/apps/sim/components/ui/shimmer-text.tsx
+++ b/apps/sim/components/ui/shimmer-text.tsx
@@ -10,7 +10,7 @@ type ShimmerTextProps = {
/**
* Sweeping-highlight shimmer over a text phrase — the same treatment as the
- * ThinkingLoader's "Thinking…" label, reusable on any active/streaming row.
+ * ThinkingLoader's "Thinking" label, reusable on any active/streaming row.
* Size and weight come from the consumer's className; the gradient replaces
* the text color, so color classes are ignored while shimmering.
*/
diff --git a/apps/sim/components/ui/thinking-loader.tsx b/apps/sim/components/ui/thinking-loader.tsx
index 2aafa83915d..660a9d476ad 100644
--- a/apps/sim/components/ui/thinking-loader.tsx
+++ b/apps/sim/components/ui/thinking-loader.tsx
@@ -215,7 +215,7 @@ const VARIANT_PHRASE: Record = {
compass: 'In formation…', // Formation — many Pods in parallel
metaballs: 'Dispatching…', // Dispatch — sending work out
relay: 'Returning…', // Return — work coming back, consolidated
- burst: 'Thinking…', // Thinking — the Core deliberating
+ burst: 'Thinking', // Thinking — the Core deliberating
thinking: 'Standing by…', // Waiting · Sentinel — holding for a condition
orb: 'Ready', // Orb — settled, ready to act
}
@@ -244,7 +244,7 @@ export interface ThinkingLoaderProps {
size?: number
/** Shape-to-shape goo overlap duration. Defaults to the loader's CSS timing. */
morphDurationMs?: number
- /** Optional status text (e.g. "Thinking…") rendered beside the goo with a shimmer sweep. */
+ /** Optional status text (e.g. "Thinking") rendered beside the goo with a shimmer sweep. */
label?: string
/**
* Show a world-aligned status phrase that matches the current shape — e.g.
@@ -288,7 +288,7 @@ export interface ThinkingLoaderProps {
*
* @example
* ```tsx
- *
+ *
* ```
*/
export function ThinkingLoader({
diff --git a/packages/emcn/src/components/index.ts b/packages/emcn/src/components/index.ts
index a7bbaccfe2d..f99d258b95e 100644
--- a/packages/emcn/src/components/index.ts
+++ b/packages/emcn/src/components/index.ts
@@ -194,6 +194,7 @@ export {
export {
OverflowText,
type OverflowTextProps,
+ overflowFadeSizeClass,
overflowTextClipClass,
overflowTextFadeClass,
} from './overflow-text/overflow-text'
diff --git a/packages/emcn/src/components/overflow-text/overflow-text.tsx b/packages/emcn/src/components/overflow-text/overflow-text.tsx
index c87d5d105e5..19c84a0b433 100644
--- a/packages/emcn/src/components/overflow-text/overflow-text.tsx
+++ b/packages/emcn/src/components/overflow-text/overflow-text.tsx
@@ -10,9 +10,14 @@ import {
useIsOverflowing,
} from '../tooltip/tooltip'
+/** Shared fade width for clipped labels and scroll regions that use the same treatment. */
+export const overflowFadeSizeClass = '[--overflow-fade-size:16px]'
+
/** Complete fade-only clipping treatment for measured special cases. */
-export const overflowTextFadeClass =
- 'overflow-hidden text-clip whitespace-nowrap [-webkit-mask-image:linear-gradient(to_right,black_calc(100%_-_16px),transparent)] [mask-image:linear-gradient(to_right,black_calc(100%_-_16px),transparent)]'
+export const overflowTextFadeClass = cn(
+ overflowFadeSizeClass,
+ 'overflow-hidden text-clip whitespace-nowrap [-webkit-mask-image:linear-gradient(to_right,black_calc(100%_-_var(--overflow-fade-size)),transparent)] [mask-image:linear-gradient(to_right,black_calc(100%_-_var(--overflow-fade-size)),transparent)]'
+)
/** Fade-free clipping for externally measured labels and rich-content overflow exceptions. */
export const overflowTextClipClass = 'block min-w-0 overflow-hidden text-clip whitespace-nowrap'
diff --git a/packages/emcn/src/components/scroll-fade/scroll-fade.module.css b/packages/emcn/src/components/scroll-fade/scroll-fade.module.css
index e391b96fa8e..ad32c7ec9a6 100644
--- a/packages/emcn/src/components/scroll-fade/scroll-fade.module.css
+++ b/packages/emcn/src/components/scroll-fade/scroll-fade.module.css
@@ -7,7 +7,7 @@
* floating control (the command palette's search field) start the band below it.
*/
.root {
- --scroll-fade-band: 12px;
+ --scroll-fade-band: var(--overflow-fade-size, 12px);
--scroll-fade-top-start: 0px;
--scroll-fade-top-end: 0px;
--scroll-fade-bottom-start: 100%;
@@ -43,7 +43,7 @@
* Same band, same rest state; the stops run left to right instead.
*/
.rootX {
- --scroll-fade-band: 12px;
+ --scroll-fade-band: var(--overflow-fade-size, 12px);
--scroll-fade-left-start: 0px;
--scroll-fade-left-end: 0px;
--scroll-fade-right-start: 100%;
diff --git a/packages/emcn/src/components/scroll-fade/scroll-fade.ts b/packages/emcn/src/components/scroll-fade/scroll-fade.ts
index 1c529a64142..aded350bc9d 100644
--- a/packages/emcn/src/components/scroll-fade/scroll-fade.ts
+++ b/packages/emcn/src/components/scroll-fade/scroll-fade.ts
@@ -12,7 +12,7 @@ export interface ScrollEdgesX {
right: boolean
}
-/** Height of the fade band at an active edge, in pixels. */
+/** Default scroll-edge fade size in pixels, before an explicit override. */
export const SCROLL_FADE_BAND_PX = 12
/**
@@ -21,7 +21,8 @@ export const SCROLL_FADE_BAND_PX = 12
* band at any edge that hides content, and stays fully opaque at every edge that
* does not — so a list that fits, or sits at its top, is never fogged.
*
- * The band is a fixed {@link SCROLL_FADE_BAND_PX}. A consumer whose top edge is
+ * The default band is {@link SCROLL_FADE_BAND_PX}; pair with `overflowFadeSizeClass`
+ * to match OverflowText. A consumer whose top edge is
* covered by a floating control sets `--scroll-fade-inset` to that control's
* height (e.g. `[--scroll-fade-inset:3rem]`) so the band starts beneath it.
*