diff --git a/examples/storybook/src/stories/helpers/streamingWidgetStories.tsx b/examples/storybook/src/stories/helpers/streamingWidgetStories.tsx index c898ae53..ebc30946 100644 --- a/examples/storybook/src/stories/helpers/streamingWidgetStories.tsx +++ b/examples/storybook/src/stories/helpers/streamingWidgetStories.tsx @@ -256,9 +256,19 @@ function createAdapter( // MiniAppShell must sit inside a provider: without one it first paints before any // Tamagui theme is registered, and the theme that the widget's own provider registers // then flips its internal Theme hook path on the next re-render ("Should have a queue"). -function StoryShell({ children, dataTestId }: { children: React.ReactNode; dataTestId: string }) { +// The shell provider shares the widget's defaultTheme so the light theme is not framed +// by the dark shell background. +function StoryShell({ + children, + dataTestId, + defaultTheme = 'dark', +}: { + children: React.ReactNode + dataTestId: string + defaultTheme?: 'light' | 'dark' +}) { return ( - + + + = {}) { return ( - - - + ) } diff --git a/examples/storybook/src/stories/streaming-widget/StreamingWidget.mdx b/examples/storybook/src/stories/streaming-widget/StreamingWidget.mdx index 847f3bec..16815c66 100644 --- a/examples/storybook/src/stories/streaming-widget/StreamingWidget.mdx +++ b/examples/storybook/src/stories/streaming-widget/StreamingWidget.mdx @@ -1,5 +1,5 @@ import { Canvas, Meta } from '@storybook/blocks'; -import * as ShowcaseStories from './StreamingWidget.stories'; +import * as ShowcaseStories from './StreamingWidgetShowcase.stories'; import * as ThemeOverridesStories from './StreamingWidgetThemeOverrides.stories'; import { DocsCallout, DocsCard, DocsGrid, DocsPage, DocsSection } from '../docs/DocsLayout'; @@ -34,7 +34,7 @@ import { DocsCallout, DocsCard, DocsGrid, DocsPage, DocsSection } from '../docs/ > Wallet gates, network handling, loading, empty, error, stream forms, pool claims, and SUP reserve states live in `QA / StreamingWidget / Runtime Fixtures`. Dark theme is the default; - `LightThemePopulated` demonstrates the explicit light-theme branch. + every fixture renders in light or dark via the `defaultTheme` control. diff --git a/examples/storybook/src/stories/streaming-widget/StreamingWidget.stories.tsx b/examples/storybook/src/stories/streaming-widget/StreamingWidgetShowcase.stories.tsx similarity index 100% rename from examples/storybook/src/stories/streaming-widget/StreamingWidget.stories.tsx rename to examples/storybook/src/stories/streaming-widget/StreamingWidgetShowcase.stories.tsx diff --git a/examples/storybook/src/stories/streaming-widget/StreamingWidgetThemeOverrides.stories.tsx b/examples/storybook/src/stories/streaming-widget/StreamingWidgetThemeOverrides.stories.tsx index 6a6dbbae..8aff2669 100644 --- a/examples/storybook/src/stories/streaming-widget/StreamingWidgetThemeOverrides.stories.tsx +++ b/examples/storybook/src/stories/streaming-widget/StreamingWidgetThemeOverrides.stories.tsx @@ -17,17 +17,18 @@ * components that fall back to Card's field set since they don't have their * own preset entries. See packages/streaming-widget/src/components/shared.tsx. * - * Controls are wired for `dark_Button` and the two targets rendered in the - * PopulatedStateStory fixture (`dark_StreamRow`, `dark_BalanceCard`) — a - * couple of high-impact targets that visibly shift the default brand, not - * exhaustive coverage of every value. The remaining Card-derived targets - * follow the same field shape and are documented below for reference. + * Controls are wired for `Button` and the two targets rendered in the + * PopulatedStateStory fixture (`StreamRow`, `BalanceCard`) — a couple of + * high-impact targets that visibly shift the default brand, not exhaustive + * coverage of every value. Each control writes both the `light_*` and + * `dark_*` key so the `defaultTheme` control can flip between themes with the + * same overrides applied. The remaining Card-derived targets follow the same + * field shape and are documented below for reference. */ import React from 'react' import type { Meta, StoryObj } from '@storybook/react' import type { StreamingWidgetProps } from '@goodwidget/streaming-widget' import { PopulatedStateStory } from '../helpers/streamingWidgetStories' -import { withDefaultPreset } from '../helpers/withDefaultPreset' import { DocsCallout, DocsList } from '../docs/DocsLayout' type ThemeOverrides = NonNullable @@ -74,6 +75,7 @@ function CodeBlock({ children }: { children: string }) { } interface OverridesArgs { + defaultTheme: 'light' | 'dark' buttonBackground: string buttonBackgroundHover: string buttonBackgroundPress: string @@ -85,22 +87,31 @@ interface OverridesArgs { } function buildThemeOverrides(args: OverridesArgs): ThemeOverrides { + const componentThemes = { + Button: { + background: args.buttonBackground, + backgroundHover: args.buttonBackgroundHover, + backgroundPress: args.buttonBackgroundPress, + backgroundFocus: args.buttonBackgroundFocus, + color: args.buttonColor, + }, + StreamRow: { + borderColor: args.streamRowBorderColor, + }, + BalanceCard: { + borderColor: args.balanceCardBorderColor, + shadowColor: args.balanceCardShadowColor, + }, + } + return { themes: { - dark_Button: { - background: args.buttonBackground, - backgroundHover: args.buttonBackgroundHover, - backgroundPress: args.buttonBackgroundPress, - backgroundFocus: args.buttonBackgroundFocus, - color: args.buttonColor, - }, - dark_StreamRow: { - borderColor: args.streamRowBorderColor, - }, - dark_BalanceCard: { - borderColor: args.balanceCardBorderColor, - shadowColor: args.balanceCardShadowColor, - }, + dark_Button: componentThemes.Button, + light_Button: componentThemes.Button, + dark_StreamRow: componentThemes.StreamRow, + light_StreamRow: componentThemes.StreamRow, + dark_BalanceCard: componentThemes.BalanceCard, + light_BalanceCard: componentThemes.BalanceCard, }, } } @@ -109,8 +120,12 @@ const meta: Meta = { title: 'Widgets/StreamingWidget/Theme overrides', tags: ['integrator', 'showcase'], parameters: { layout: 'padded' }, - decorators: [withDefaultPreset], argTypes: { + defaultTheme: { + control: 'radio', + options: ['light', 'dark'], + description: 'Base theme applied via the widget’s own defaultTheme prop.', + }, buttonBackground: { control: 'color', description: 'themes.dark_Button.background' }, buttonBackgroundHover: { control: 'color', description: 'themes.dark_Button.backgroundHover' }, buttonBackgroundPress: { control: 'color', description: 'themes.dark_Button.backgroundPress' }, @@ -121,6 +136,7 @@ const meta: Meta = { balanceCardShadowColor: { control: 'color', description: 'themes.dark_BalanceCard.shadowColor' }, }, args: { + defaultTheme: 'light', buttonBackground: '#7C3AED', buttonBackgroundHover: '#6D28D9', buttonBackgroundPress: '#5B21B6', @@ -164,7 +180,7 @@ export const Playground: Story = { - + ) }, diff --git a/packages/streaming-widget/src/components/BalancesTab.tsx b/packages/streaming-widget/src/components/BalancesTab.tsx index 8a2e0b13..0870a350 100644 --- a/packages/streaming-widget/src/components/BalancesTab.tsx +++ b/packages/streaming-widget/src/components/BalancesTab.tsx @@ -4,6 +4,7 @@ import { Anchor, Badge, BadgeText, + Button, ButtonText, Icon, Spinner, @@ -20,7 +21,7 @@ import { superfluidReserveUrl, tokenSymbol, } from './format' -import { ActionButton, BalanceCard, StreamingTabContent } from './shared' +import { compactButtonProps, BalanceCard, StreamingTabContent } from './shared' interface ExternalLinkProps { href: string @@ -72,9 +73,9 @@ export function BalancesTab({ Super Token Balance - + {balanceLoading && } diff --git a/packages/streaming-widget/src/components/HistoryTab.tsx b/packages/streaming-widget/src/components/HistoryTab.tsx index f8c4de86..9090ba78 100644 --- a/packages/streaming-widget/src/components/HistoryTab.tsx +++ b/packages/streaming-widget/src/components/HistoryTab.tsx @@ -1,12 +1,13 @@ import React, { useState } from 'react' -import { ButtonText, Heading, Spinner, Text, XStack, YStack } from '@goodwidget/ui' +import { Button, ButtonText, Heading, Spinner, Text, XStack, YStack } from '@goodwidget/ui' import type { StreamListItem, StreamStatusFilter } from '../widgetRuntimeContract' import { tokenSymbol } from './format' import { StreamCard } from './StreamCard' import { EmptyStateCard, ErrorStateCard, - ActionButton, + compactButtonProps, + secondaryButtonStateProps, SecondaryButtonText, StreamingTabContent, } from './shared' @@ -61,24 +62,33 @@ export function HistoryTab({ Stream history - + {(['all', 'active', 'ended'] as StreamStatusFilter[]).map((filter) => ( - selectStatus(filter)} variant={status === filter ? 'primary' : 'secondary'} + {...(status === filter ? {} : secondaryButtonStateProps)} > {status === filter ? ( {STATUS_LABELS[filter]} ) : ( {STATUS_LABELS[filter]} )} - + ))} @@ -92,9 +102,9 @@ export function HistoryTab({ {!loading && error && ( {error} - + )} @@ -113,12 +123,15 @@ export function HistoryTab({ ))} {!loading && !error && hasMoreHistory && ( - setHistoryLimit((count) => count + PAGE_SIZE)} > Show more - + )} ) diff --git a/packages/streaming-widget/src/components/PoolCard.tsx b/packages/streaming-widget/src/components/PoolCard.tsx index dc37902d..bf7a1fd8 100644 --- a/packages/streaming-widget/src/components/PoolCard.tsx +++ b/packages/streaming-widget/src/components/PoolCard.tsx @@ -3,6 +3,7 @@ import { AddressDisplay, Badge, BadgeText, + Button, ButtonText, Spinner, Text, @@ -14,7 +15,8 @@ import type { PoolMembershipItem, WriteStatus } from '../widgetRuntimeContract' import { formatWeiAmount } from './format' import { PoolRow, - ActionButton, + compactButtonProps, + secondaryButtonStateProps, SecondaryButtonText, WriteStatusBadge, type SuperTokenSymbol, @@ -87,9 +89,15 @@ export function PoolCard({ Could not load claimable amount. - + )} @@ -97,8 +105,11 @@ export function PoolCard({ {pool.isConnected ? ( <> - onDisconnect(pool.poolId)} @@ -108,20 +119,25 @@ export function PoolCard({ ) : ( Disconnect )} - + ) : ( <> - onClaim(pool.poolId)} > {isClaimPending ? : Claim} - + - onConnect(pool.poolId)} > @@ -130,7 +146,7 @@ export function PoolCard({ ) : ( Connect )} - + )} diff --git a/packages/streaming-widget/src/components/PoolsTab.tsx b/packages/streaming-widget/src/components/PoolsTab.tsx index ae364fed..bc6d0adb 100644 --- a/packages/streaming-widget/src/components/PoolsTab.tsx +++ b/packages/streaming-widget/src/components/PoolsTab.tsx @@ -1,10 +1,10 @@ import React from 'react' -import { ButtonText, Spinner, Text, YStack } from '@goodwidget/ui' +import { Button, ButtonText, Spinner, Text, YStack } from '@goodwidget/ui' import type { Address } from 'viem' import type { PoolMembershipItem, WriteStatus } from '../widgetRuntimeContract' import { tokenSymbol } from './format' import { PoolCard } from './PoolCard' -import { ActionButton, EmptyStateCard, ErrorStateCard, StreamingTabContent } from './shared' +import { compactButtonProps, EmptyStateCard, ErrorStateCard, StreamingTabContent } from './shared' interface PoolsTabProps { pools: PoolMembershipItem[] @@ -49,9 +49,9 @@ export function PoolsTab({ {!loading && error && ( {error} - + )} @@ -60,9 +60,9 @@ export function PoolsTab({ No GDA pool memberships found for this address. - + )} diff --git a/packages/streaming-widget/src/components/SetStreamForm.tsx b/packages/streaming-widget/src/components/SetStreamForm.tsx index afa04881..bb1957ac 100644 --- a/packages/streaming-widget/src/components/SetStreamForm.tsx +++ b/packages/streaming-widget/src/components/SetStreamForm.tsx @@ -1,12 +1,27 @@ import React from 'react' -import { ButtonText, Heading, Input, Select, Spinner, Text, XStack, YStack } from '@goodwidget/ui' +import { + Button, + ButtonText, + Heading, + Input, + Select, + Spinner, + Text, + XStack, + YStack, +} from '@goodwidget/ui' import type { SetStreamFormState, StreamTimeUnit, WriteStatus, } from '../widgetRuntimeContract' import { formatFlowRatePerDay } from './format' -import { ActionButton, SetStreamFormCard } from './shared' +import { + compactButtonProps, + SecondaryButtonText, + secondaryButtonStateProps, + SetStreamFormCard, +} from './shared' interface SetStreamFormProps { form: SetStreamFormState @@ -100,9 +115,10 @@ export function SetStreamForm({ )} - - + {(status === 'success' || status === 'error') && ( - - Reset - + )} - + ) } diff --git a/packages/streaming-widget/src/components/StreamCard.tsx b/packages/streaming-widget/src/components/StreamCard.tsx index a8f45651..bbc85748 100644 --- a/packages/streaming-widget/src/components/StreamCard.tsx +++ b/packages/streaming-widget/src/components/StreamCard.tsx @@ -3,6 +3,7 @@ import { AddressDisplay, Badge, BadgeText, + Button, ButtonText, Icon, Separator, @@ -23,7 +24,8 @@ import { liveStreamedAmount, } from './format' import { - ActionButton, + compactButtonProps, + secondaryButtonStateProps, SecondaryButtonText, StreamRow, type SuperTokenSymbol, @@ -191,19 +193,28 @@ export function StreamCard({ {showActions && ( {onEdit && ( - onEdit(stream)} > Update - + )} {onCancel && ( - onCancel(stream)}> + )} )} diff --git a/packages/streaming-widget/src/components/StreamsTab.tsx b/packages/streaming-widget/src/components/StreamsTab.tsx index ed51c943..8fc7233a 100644 --- a/packages/streaming-widget/src/components/StreamsTab.tsx +++ b/packages/streaming-widget/src/components/StreamsTab.tsx @@ -1,5 +1,14 @@ import React, { useState } from 'react' -import { ButtonText, Heading, Separator, Spinner, Text, XStack, YStack } from '@goodwidget/ui' +import { + Button, + ButtonText, + Heading, + Separator, + Spinner, + Text, + XStack, + YStack, +} from '@goodwidget/ui' import type { SetStreamFormState, StreamDirection, @@ -13,7 +22,8 @@ import { StreamCard } from './StreamCard' import { EmptyStateCard, ErrorStateCard, - ActionButton, + compactButtonProps, + secondaryButtonStateProps, SecondaryButtonText, StreamingTabContent, } from './shared' @@ -85,9 +95,13 @@ export function StreamsTab({ return ( - (isFormOpen ? closeForm() : setShowForm(true))}> + {isFormOpen && ( @@ -111,17 +125,20 @@ export function StreamsTab({ {(['all', 'incoming', 'outgoing'] as StreamDirection[]).map((filter) => ( - setDirection(filter)} variant={direction === filter ? 'primary' : 'secondary'} + {...(direction === filter ? {} : secondaryButtonStateProps)} > {direction === filter ? ( {DIRECTION_LABELS[filter]} ) : ( {DIRECTION_LABELS[filter]} )} - + ))} @@ -135,9 +152,9 @@ export function StreamsTab({ {!loading && error && ( {error} - + )} @@ -146,9 +163,9 @@ export function StreamsTab({ {emptyStreamsMessage} - + )} diff --git a/packages/streaming-widget/src/components/WalletGate.tsx b/packages/streaming-widget/src/components/WalletGate.tsx index e69d8095..a5d02ba0 100644 --- a/packages/streaming-widget/src/components/WalletGate.tsx +++ b/packages/streaming-widget/src/components/WalletGate.tsx @@ -1,7 +1,7 @@ import React from 'react' -import { ButtonText, Heading, Text, XStack } from '@goodwidget/ui' +import { Button, ButtonText, Heading, Text, XStack } from '@goodwidget/ui' import { STREAMING_CHAINS } from '../widgetRuntimeContract' -import { ActionButton, EmptyStateCard } from './shared' +import { compactButtonProps, EmptyStateCard } from './shared' interface WalletGateProps { isConnected: boolean @@ -25,9 +25,9 @@ export function WalletGate({ Connect your wallet to view streams, pools, and balances. - + ) } @@ -41,13 +41,24 @@ export function WalletGate({ Switch to Celo or Base to use the streaming widget. - - onSwitchChain(STREAMING_CHAINS.CELO)}> + {/* Wraps onto two rows when both buttons don't fit (e.g. 390px mobile). */} + + + ) diff --git a/packages/streaming-widget/src/components/shared.tsx b/packages/streaming-widget/src/components/shared.tsx index 89250332..e45330f5 100644 --- a/packages/streaming-widget/src/components/shared.tsx +++ b/packages/streaming-widget/src/components/shared.tsx @@ -2,8 +2,6 @@ import React from 'react' import { Badge, BadgeText, - Button, - type ButtonProps, ButtonText, Card, YStack, @@ -13,6 +11,25 @@ import type { WriteStatus } from '../widgetRuntimeContract' export type SuperTokenSymbol = 'G$' | 'SUP' +// Mirrors the compactButtonProps convention established in +// ai-credits-widget/src/components/shared/styles.ts — spread onto every +// - ) -} diff --git a/tests/widgets/streaming-widget/states.spec.ts b/tests/widgets/streaming-widget/states.spec.ts index c1596ad8..f1ecb6ef 100644 --- a/tests/widgets/streaming-widget/states.spec.ts +++ b/tests/widgets/streaming-widget/states.spec.ts @@ -1,15 +1,13 @@ -import { test, expect, type Page } from '@playwright/test' +import { test, expect, type Locator, type Page } from '@playwright/test' const STORY_PREFIX = '/iframe.html?id=qa-streamingwidget-runtime-fixtures--' -function storyUrl(storyId: string): string { - return `${STORY_PREFIX}${storyId}&viewMode=story` -} +// Every flow is exercised in both themes so light/dark parity stays covered. +const THEMES = ['dark', 'light'] as const +type WidgetTheme = (typeof THEMES)[number] -async function gotoStory(page: Page, storyId: string): Promise { - await page.goto(storyUrl(storyId)) - await page.waitForLoadState('domcontentloaded') - await page.waitForFunction(() => document.body.innerText.trim().length > 0) +function storyUrl(storyId: string, theme: WidgetTheme): string { + return `${STORY_PREFIX}${storyId}&viewMode=story&args=defaultTheme:${theme}` } async function bodyText(page: Page): Promise { @@ -27,260 +25,400 @@ async function expectBodyToContain(page: Page, patterns: Array) } } -async function saveScreenshot(page: Page, name: string) { - await page.screenshot({ - path: `tests/widgets/streaming-widget/test-results/${name}.png`, - fullPage: true, +// WCAG contrast ratio between a button's label colour and the fill actually painted behind +// it (walking up to the first non-transparent ancestor background). +async function labelContrast(button: Locator): Promise { + return button.evaluate((el) => { + const parse = (c: string) => { + const [r, g, b, a = 1] = (c.match(/[\d.]+/g) ?? []).map(Number) + return { r, g, b, a } + } + const luminance = ({ r, g, b }: { r: number; g: number; b: number }) => { + const channel = (v: number) => { + const s = v / 255 + return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4 + } + return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b) + } + let node: Element | null = el + let background = parse('rgb(255, 255, 255)') + while (node) { + const candidate = parse(getComputedStyle(node).backgroundColor) + if (candidate.a > 0.5) { + background = candidate + break + } + node = node.parentElement + } + const label = Array.from(el.querySelectorAll('*')).find( + (child) => child.children.length === 0 && child.textContent?.trim(), + ) + const foreground = parse(getComputedStyle(label ?? el).color) + const [light, dark] = [luminance(foreground), luminance(background)].sort((a, b) => b - a) + return (light + 0.05) / (dark + 0.05) }) } -test('StreamingWidget shows the disconnected wallet gate', async ({ page }) => { - await gotoStory(page, 'no-wallet') +// Hover, press and keyboard focus must never fill an outlined button with its own label +// colour. A collapsed label sits at ~1:1, so 2:1 is a safe floor for "still readable". +async function expectReadableInteractiveStates(page: Page, button: Locator) { + await button.scrollIntoViewIfNeeded() - await expectBodyToContain(page, ['Wallet not connected', 'Connect Wallet']) - await saveScreenshot(page, 'sw-01-no-wallet') -}) + await button.hover() + expect(await labelContrast(button), 'hover').toBeGreaterThan(2) -test('StreamingWidget renders tab navigation and switches views', async ({ page }) => { - await gotoStory(page, 'populated-state') + await page.mouse.down() + expect(await labelContrast(button), 'press').toBeGreaterThan(2) + // Release away from the button so the press does not trigger its action. + await page.mouse.move(0, 0) + await page.mouse.up() - await expectBodyToContain(page, ['Streams', 'History', 'Pools', 'Balances', 'Active streams']) + await button.focus() + expect(await labelContrast(button), 'focus').toBeGreaterThan(2) + await button.blur() +} + +for (const theme of THEMES) { + test.describe(`${theme} theme`, () => { + async function gotoStory(page: Page, storyId: string): Promise { + await page.goto(storyUrl(storyId, theme)) + await page.waitForLoadState('domcontentloaded') + await page.waitForFunction(() => document.body.innerText.trim().length > 0) + } + + // Screenshots are grouped per theme: test-results//.png + async function saveScreenshot(page: Page, name: string) { + await page.screenshot({ + path: `tests/widgets/streaming-widget/test-results/${theme}/${name}.png`, + fullPage: true, + }) + } - await page.getByText('History').first().click() - await expectBodyToContain(page, ['Stream history', 'Show more']) + test('StreamingWidget shows the disconnected wallet gate', async ({ page }) => { + await gotoStory(page, 'no-wallet') - await page.getByText('Pools').first().click() - await expectBodyToContain(page, ['Claimable', 'Claim', 'Connect']) + await expectBodyToContain(page, ['Wallet not connected', 'Connect Wallet']) + await saveScreenshot(page, 'sw-01-no-wallet') + }) - await page.getByText('Balances').first().click() - await expectBodyToContain(page, ['Super Token Balance', 'SUP Balance', 'SUP Reserve']) + test('StreamingWidget renders tab navigation and switches views', async ({ page }) => { + await gotoStory(page, 'populated-state') - await saveScreenshot(page, 'sw-02-tab-navigation') -}) + await expectBodyToContain(page, ['Streams', 'History', 'Pools', 'Balances', 'Active streams']) -test('StreamingWidget shows the unsupported network prompt', async ({ page }) => { - await gotoStory(page, 'wrong-chain') + await page.getByText('History').first().click() + await expectBodyToContain(page, ['Stream history', 'Show more']) - await expectBodyToContain(page, [ - 'Unsupported network', - 'Switch to Celo', - 'Switch to Base', - ]) - await saveScreenshot(page, 'sw-03-wrong-chain') -}) + await page.getByText('Pools').first().click() + await expectBodyToContain(page, ['Claimable', 'Claim', 'Connect']) -test('StreamingWidget shows loading states for streams and history', async ({ page }) => { - await gotoStory(page, 'loading-state') + await page.getByText('Balances').first().click() + await expectBodyToContain(page, ['Super Token Balance', 'SUP Balance', 'SUP Reserve']) - await expectBodyToContain(page, ['Loading streams']) + await saveScreenshot(page, 'sw-02-tab-navigation') + }) - await page.getByText('History').first().click() - await expectBodyToContain(page, ['Loading stream history']) - await saveScreenshot(page, 'sw-04-loading-state') -}) + test('StreamingWidget shows the unsupported network prompt', async ({ page }) => { + await gotoStory(page, 'wrong-chain') -test('StreamingWidget shows empty states for streams and history', async ({ page }) => { - await gotoStory(page, 'empty-state') + await expectBodyToContain(page, ['Unsupported network', 'Switch to Celo', 'Switch to Base']) + await saveScreenshot(page, 'sw-03-wrong-chain') + }) - await expectBodyToContain(page, ['No active streams found.']) + test('StreamingWidget shows loading states for streams and history', async ({ page }) => { + await gotoStory(page, 'loading-state') - await page.getByText('History').first().click() - await expectBodyToContain(page, ['No stream history found.']) - await saveScreenshot(page, 'sw-05-empty-state') -}) - -test('StreamingWidget shows error states for streams and history', async ({ page }) => { - await gotoStory(page, 'error-state') - - await expectBodyToContain(page, ['Unable to reach the network', 'Retry']) - - await page.getByText('History').first().click() - await expectBodyToContain(page, ['Unable to load stream history.', 'Retry']) - await saveScreenshot(page, 'sw-06-error-state') -}) - -test('StreamingWidget shows populated incoming and outgoing stream views', async ({ page }) => { - await gotoStory(page, 'populated-state') - - await expectBodyToContain(page, [ - 'Active streams', - 'Incoming', - 'Outgoing', - /100\s+G\$\s*\/mo/, - ]) - - await page.getByText('Incoming').first().click() - await expectBodyToContain(page, ['Incoming']) - - await page.getByText('Outgoing').first().click() - await expectBodyToContain(page, ['Outgoing']) - - await saveScreenshot(page, 'sw-07-populated-streams') - - await page.getByText('History').first().click() - await expectBodyToContain(page, ['Stream history', 'Show more']) - await saveScreenshot(page, 'sw-22-stream-history-tab') -}) - -test('StreamingWidget expands and collapses stream details', async ({ page }) => { - await gotoStory(page, 'populated-state') - - const expandButton = page.getByRole('button', { name: 'Expand stream details' }).first() - await expandButton.click() - await expectBodyToContain(page, ['Token', 'Flow rate', 'Update', 'Cancel stream']) - await saveScreenshot(page, 'sw-24-stream-details-expanded') - - await page.getByRole('button', { name: 'Collapse stream details' }).first().click() - await expect(page.getByText('Flow rate', { exact: true })).toHaveCount(0) - await saveScreenshot(page, 'sw-25-stream-details-collapsed') -}) - -test('StreamingWidget filters stream history by status', async ({ page }) => { - await gotoStory(page, 'populated-state') - await page.getByText('History').first().click() - - await page.getByRole('button', { name: 'Active' }).click() - await expectBodyToContain(page, ['Active']) - await expect(page.getByRole('button', { name: 'Expand stream details' })).toHaveCount(2) - await saveScreenshot(page, 'sw-26-history-active-filter') - - await page.getByRole('button', { name: 'Ended' }).click() - await expectBodyToContain(page, ['Ended']) - await expect(page.getByRole('button', { name: 'Expand stream details' })).toHaveCount(4) - await saveScreenshot(page, 'sw-27-history-ended-filter') -}) - -test('StreamingWidget covers stream cancellation and update states', async ({ page }) => { - await gotoStory(page, 'cancel-stream-pending') - await page.getByRole('button', { name: 'Expand stream details' }).first().click() - await expect(page.getByRole('button', { name: 'Update' })).toBeVisible() - await expect(page.getByText('Cancel stream', { exact: true })).toHaveCount(0) - await saveScreenshot(page, 'sw-28-cancel-stream-pending') - - await gotoStory(page, 'cancel-stream-failure') - await page.getByRole('button', { name: 'Expand stream details' }).first().click() - await expectBodyToContain(page, ['Transaction cancelled by wallet.']) - await saveScreenshot(page, 'sw-29-cancel-stream-failure') - - await gotoStory(page, 'update-stream-form') - // Heading renders as styled Text, not an h1-h6, so match on text not role. - await expect(page.getByText('Update Stream').first()).toBeVisible() - await expect(page.getByRole('button', { name: 'Update Stream' })).toBeVisible() - await saveScreenshot(page, 'sw-30-update-stream-form') -}) - -test('StreamingWidget renders usable mobile and desktop layouts', async ({ page }) => { - await page.setViewportSize({ width: 390, height: 844 }) - await gotoStory(page, 'populated-state') - await expectBodyToContain(page, ['Streams', 'History', 'Active streams']) - await saveScreenshot(page, 'sw-18-mobile-populated') - - await page.setViewportSize({ width: 1280, height: 900 }) - await gotoStory(page, 'populated-state') - await expectBodyToContain(page, ['Streams', 'History', 'Pools', 'Balances', 'Active streams']) - await saveScreenshot(page, 'sw-19-desktop-populated') -}) - -test('StreamingWidget create/update form shows invalid input feedback', async ({ page }) => { - await gotoStory(page, 'create-update-invalid-input') - - await expectBodyToContain(page, [ - 'Create / Update Stream', - 'Recipient must be a valid Ethereum address', - ]) - await page.getByRole('listbox').click() - await expectBodyToContain(page, ['per month', 'per day', 'per year']) - await expect(page.getByText('per second')).toHaveCount(0) - await expect(page.getByText('per minute')).toHaveCount(0) - await expect(page.getByText('per hour')).toHaveCount(0) - await expect(page.getByText('per week')).toHaveCount(0) - await saveScreenshot(page, 'sw-08-create-update-invalid') -}) - -test('StreamingWidget create/update form shows pending and success states', async ({ page }) => { - await gotoStory(page, 'create-update-pending') - await expectBodyToContain(page, ['Create / Update Stream', '/day', 'Transaction pending...']) - await saveScreenshot(page, 'sw-09-create-update-pending') - - await gotoStory(page, 'create-update-success') - await expectBodyToContain(page, ['Create / Update Stream', 'Stream set! Tx:']) - await saveScreenshot(page, 'sw-10-create-update-success') -}) - -test('StreamingWidget create/update form shows failure state', async ({ page }) => { - await gotoStory(page, 'create-update-failure') - - await expectBodyToContain(page, ['Create / Update Stream', 'Transaction cancelled by wallet.']) - await saveScreenshot(page, 'sw-11-create-update-failure') -}) - -test('StreamingWidget shows pool claim amount and lifecycle states', async ({ page }) => { - await gotoStory(page, 'pool-claim-state') - await expectBodyToContain(page, ['Claimable', '12.5', 'Claim']) - await saveScreenshot(page, 'sw-12-pool-claim') - - await gotoStory(page, 'pool-connected-state') - await expectBodyToContain(page, ['Connected', 'Claimable', 'Disconnect']) - await expect(page.getByText('Claim', { exact: true })).toHaveCount(0) - await expect(page.getByText('Connect', { exact: true })).toHaveCount(0) - await saveScreenshot(page, 'sw-23-pool-connected') - - await gotoStory(page, 'pool-claim-pending') - await expectBodyToContain(page, ['Connected', 'Claimable', '12.5', 'Pending', 'Disconnect']) - await expect(page.getByText('Claim', { exact: true })).toHaveCount(0) - await expect(page.getByText('Connect', { exact: true })).toHaveCount(0) - await saveScreenshot(page, 'sw-13-pool-claim-pending') - - await gotoStory(page, 'pool-claim-success') - await expectBodyToContain(page, ['Connected', 'Claimable', 'Done', 'Disconnect']) - await expect(page.getByText('Claim', { exact: true })).toHaveCount(0) - await expect(page.getByText('Connect', { exact: true })).toHaveCount(0) - await saveScreenshot(page, 'sw-14-pool-claim-success') - - await gotoStory(page, 'pool-claim-error') - await expectBodyToContain(page, [ - 'Connected', - 'Pool claim failed. Please retry.', - 'Failed', - 'Disconnect', - ]) - await expect(page.getByText('Claim', { exact: true })).toHaveCount(0) - await expect(page.getByText('Connect', { exact: true })).toHaveCount(0) - await saveScreenshot(page, 'sw-15-pool-claim-error') - - await gotoStory(page, 'pool-claimable-amount-error') - await expectBodyToContain(page, ['Could not load claimable amount.', 'Retry']) - await saveScreenshot(page, 'sw-20-pool-claimable-amount-error') - - await page.getByText('Retry').first().click() - await expectBodyToContain(page, ['Loading pool memberships']) - await saveScreenshot(page, 'sw-21-pool-claimable-retry-loading') -}) - -test('StreamingWidget shows read-only Base SUP balance and reserve data', async ({ page }) => { - await gotoStory(page, 'base-sup-balance-and-reserve') - await expectBodyToContain(page, [ - 'Super Token Balance', - 'SUP Balance', - 'SUP Reserve', - 'To see your active SUP streams visit app.superfluid.org', - '112.75', - 'Reserve locker', - 'Available', - 'Staked', - 'Open reserve in Superfluid', - ]) - await saveScreenshot(page, 'sw-16-base-sup-reserve') - - await gotoStory(page, 'non-base-sup-reserve-disabled') - await expectBodyToContain(page, [ - 'Super Token Balance', - 'Celo', - 'SUP Balance', - 'SUP Reserve', - 'To see your active SUP streams visit app.superfluid.org', - '112.75', - 'Open reserve in Superfluid', - ]) - await saveScreenshot(page, 'sw-17-non-base-reserve-disabled') -}) + await expectBodyToContain(page, ['Loading streams']) + + await page.getByText('History').first().click() + await expectBodyToContain(page, ['Loading stream history']) + await saveScreenshot(page, 'sw-04-loading-state') + }) + + test('StreamingWidget shows empty states for streams and history', async ({ page }) => { + await gotoStory(page, 'empty-state') + + await expectBodyToContain(page, ['No active streams found.']) + + await page.getByText('History').first().click() + await expectBodyToContain(page, ['No stream history found.']) + await saveScreenshot(page, 'sw-05-empty-state') + }) + + test('StreamingWidget shows error states for streams and history', async ({ page }) => { + await gotoStory(page, 'error-state') + + await expectBodyToContain(page, ['Unable to reach the network', 'Retry']) + + await page.getByText('History').first().click() + await expectBodyToContain(page, ['Unable to load stream history.', 'Retry']) + await saveScreenshot(page, 'sw-06-error-state') + }) + + test('StreamingWidget shows populated incoming and outgoing stream views', async ({ page }) => { + await gotoStory(page, 'populated-state') + + await expectBodyToContain(page, [ + 'Active streams', + 'Incoming', + 'Outgoing', + /100\s+G\$\s*\/mo/, + ]) + + await page.getByText('Incoming').first().click() + await expectBodyToContain(page, ['Incoming']) + + await page.getByText('Outgoing').first().click() + await expectBodyToContain(page, ['Outgoing']) + + await saveScreenshot(page, 'sw-07-populated-streams') + + await page.getByText('History').first().click() + await expectBodyToContain(page, ['Stream history', 'Show more']) + await saveScreenshot(page, 'sw-22-stream-history-tab') + }) + + test('StreamingWidget expands and collapses stream details', async ({ page }) => { + await gotoStory(page, 'populated-state') + + const expandButton = page.getByRole('button', { name: 'Expand stream details' }).first() + await expandButton.click() + await expectBodyToContain(page, ['Token', 'Flow rate', 'Update', 'Cancel stream']) + await saveScreenshot(page, 'sw-24-stream-details-expanded') + + await page.getByRole('button', { name: 'Collapse stream details' }).first().click() + await expect(page.getByText('Flow rate', { exact: true })).toHaveCount(0) + await saveScreenshot(page, 'sw-25-stream-details-collapsed') + }) + + test('StreamingWidget filters stream history by status', async ({ page }) => { + await gotoStory(page, 'populated-state') + await page.getByText('History').first().click() + + await page.getByRole('button', { name: 'Active' }).click() + await expectBodyToContain(page, ['Active']) + await expect(page.getByRole('button', { name: 'Expand stream details' })).toHaveCount(2) + await saveScreenshot(page, 'sw-26-history-active-filter') + + await page.getByRole('button', { name: 'Ended' }).click() + await expectBodyToContain(page, ['Ended']) + await expect(page.getByRole('button', { name: 'Expand stream details' })).toHaveCount(4) + await saveScreenshot(page, 'sw-27-history-ended-filter') + }) + + test('StreamingWidget covers stream cancellation and update states', async ({ page }) => { + await gotoStory(page, 'cancel-stream-pending') + await page.getByRole('button', { name: 'Expand stream details' }).first().click() + await expect(page.getByRole('button', { name: 'Update' })).toBeVisible() + await expect(page.getByText('Cancel stream', { exact: true })).toHaveCount(0) + await saveScreenshot(page, 'sw-28-cancel-stream-pending') + + await gotoStory(page, 'cancel-stream-failure') + await page.getByRole('button', { name: 'Expand stream details' }).first().click() + await expectBodyToContain(page, ['Transaction cancelled by wallet.']) + await saveScreenshot(page, 'sw-29-cancel-stream-failure') + + await gotoStory(page, 'update-stream-form') + // Heading renders as styled Text, not an h1-h6, so match on text not role. + await expect(page.getByText('Update Stream').first()).toBeVisible() + await expect(page.getByRole('button', { name: 'Update Stream' })).toBeVisible() + await saveScreenshot(page, 'sw-30-update-stream-form') + }) + + test('StreamingWidget renders usable mobile and desktop layouts', async ({ page }) => { + await page.setViewportSize({ width: 390, height: 844 }) + await gotoStory(page, 'populated-state') + await expectBodyToContain(page, ['Streams', 'History', 'Active streams']) + await saveScreenshot(page, 'sw-18-mobile-populated') + + await page.setViewportSize({ width: 1280, height: 900 }) + await gotoStory(page, 'populated-state') + await expectBodyToContain(page, ['Streams', 'History', 'Pools', 'Balances', 'Active streams']) + await saveScreenshot(page, 'sw-19-desktop-populated') + }) + + test('StreamingWidget create/update form shows invalid input feedback', async ({ page }) => { + await gotoStory(page, 'create-update-invalid-input') + + await expectBodyToContain(page, [ + 'Create / Update Stream', + 'Recipient must be a valid Ethereum address', + ]) + await page.getByRole('listbox').click() + await expectBodyToContain(page, ['per month', 'per day', 'per year']) + await expect(page.getByText('per second')).toHaveCount(0) + await expect(page.getByText('per minute')).toHaveCount(0) + await expect(page.getByText('per hour')).toHaveCount(0) + await expect(page.getByText('per week')).toHaveCount(0) + await saveScreenshot(page, 'sw-08-create-update-invalid') + }) + + test('StreamingWidget create/update form shows pending and success states', async ({ + page, + }) => { + await gotoStory(page, 'create-update-pending') + await expectBodyToContain(page, ['Create / Update Stream', '/day', 'Transaction pending...']) + await saveScreenshot(page, 'sw-09-create-update-pending') + + await gotoStory(page, 'create-update-success') + await expectBodyToContain(page, ['Create / Update Stream', 'Stream set! Tx:']) + await saveScreenshot(page, 'sw-10-create-update-success') + }) + + test('StreamingWidget create/update form shows failure state', async ({ page }) => { + await gotoStory(page, 'create-update-failure') + + await expectBodyToContain(page, [ + 'Create / Update Stream', + 'Transaction cancelled by wallet.', + ]) + await saveScreenshot(page, 'sw-11-create-update-failure') + }) + + test('StreamingWidget shows pool claim amount and lifecycle states', async ({ page }) => { + await gotoStory(page, 'pool-claim-state') + await expectBodyToContain(page, ['Claimable', '12.5', 'Claim']) + await saveScreenshot(page, 'sw-12-pool-claim') + + await gotoStory(page, 'pool-connected-state') + await expectBodyToContain(page, ['Connected', 'Claimable', 'Disconnect']) + await expect(page.getByText('Claim', { exact: true })).toHaveCount(0) + await expect(page.getByText('Connect', { exact: true })).toHaveCount(0) + await saveScreenshot(page, 'sw-23-pool-connected') + + await gotoStory(page, 'pool-claim-pending') + await expectBodyToContain(page, ['Connected', 'Claimable', '12.5', 'Pending', 'Disconnect']) + await expect(page.getByText('Claim', { exact: true })).toHaveCount(0) + await expect(page.getByText('Connect', { exact: true })).toHaveCount(0) + await saveScreenshot(page, 'sw-13-pool-claim-pending') + + await gotoStory(page, 'pool-claim-success') + await expectBodyToContain(page, ['Connected', 'Claimable', 'Done', 'Disconnect']) + await expect(page.getByText('Claim', { exact: true })).toHaveCount(0) + await expect(page.getByText('Connect', { exact: true })).toHaveCount(0) + await saveScreenshot(page, 'sw-14-pool-claim-success') + + await gotoStory(page, 'pool-claim-error') + await expectBodyToContain(page, [ + 'Connected', + 'Pool claim failed. Please retry.', + 'Failed', + 'Disconnect', + ]) + await expect(page.getByText('Claim', { exact: true })).toHaveCount(0) + await expect(page.getByText('Connect', { exact: true })).toHaveCount(0) + await saveScreenshot(page, 'sw-15-pool-claim-error') + + await gotoStory(page, 'pool-claimable-amount-error') + await expectBodyToContain(page, ['Could not load claimable amount.', 'Retry']) + await saveScreenshot(page, 'sw-20-pool-claimable-amount-error') + + await page.getByText('Retry').first().click() + await expectBodyToContain(page, ['Loading pool memberships']) + await saveScreenshot(page, 'sw-21-pool-claimable-retry-loading') + }) + + test('StreamingWidget shows read-only Base SUP balance and reserve data', async ({ page }) => { + await gotoStory(page, 'base-sup-balance-and-reserve') + await expectBodyToContain(page, [ + 'Super Token Balance', + 'SUP Balance', + 'SUP Reserve', + 'To see your active SUP streams visit app.superfluid.org', + '112.75', + 'Reserve locker', + 'Available', + 'Staked', + 'Open reserve in Superfluid', + ]) + await saveScreenshot(page, 'sw-16-base-sup-reserve') + + await gotoStory(page, 'non-base-sup-reserve-disabled') + await expectBodyToContain(page, [ + 'Super Token Balance', + 'Celo', + 'SUP Balance', + 'SUP Reserve', + 'To see your active SUP streams visit app.superfluid.org', + '112.75', + 'Open reserve in Superfluid', + ]) + await saveScreenshot(page, 'sw-17-non-base-reserve-disabled') + }) + + test('StreamingWidget theme overrides playground registers light and dark keys', async ({ + page, + }) => { + await page.goto( + `/iframe.html?id=widgets-streamingwidget-theme-overrides--playground&viewMode=story&args=defaultTheme:${theme}`, + ) + await page.waitForFunction(() => document.body.innerText.trim().length > 0) + + await expectBodyToContain(page, [ + '"light_Button"', + '"dark_Button"', + '"light_StreamRow"', + '"dark_BalanceCard"', + 'Active streams', + ]) + await saveScreenshot(page, 'sw-31-theme-overrides-playground') + }) + test('StreamingWidget keeps both switch-network buttons inside the card at 390px', async ({ + page, + }) => { + await page.setViewportSize({ width: 390, height: 844 }) + await gotoStory(page, 'wrong-chain') + + // EmptyStateCard is the direct parent of the "Unsupported network" heading. + const card = page.getByText('Unsupported network').locator('xpath=..') + const cardBox = await card.boundingBox() + expect(cardBox).not.toBeNull() + + for (const name of ['Switch to Celo', 'Switch to Base']) { + const box = await page.getByRole('button', { name }).boundingBox() + expect(box, name).not.toBeNull() + expect(box!.x, `${name} left edge`).toBeGreaterThanOrEqual(cardBox!.x) + expect(box!.x + box!.width, `${name} right edge`).toBeLessThanOrEqual( + cardBox!.x + cardBox!.width, + ) + expect(box!.y + box!.height, `${name} bottom edge`).toBeLessThanOrEqual( + cardBox!.y + cardBox!.height, + ) + } + await saveScreenshot(page, 'sw-32-wrong-chain-mobile') + }) + + test('StreamingWidget keeps secondary button labels readable on hover, press and focus', async ({ + page, + }) => { + await gotoStory(page, 'populated-state') + await expectReadableInteractiveStates(page, page.getByRole('button', { name: 'Incoming' })) + await expectReadableInteractiveStates(page, page.getByRole('button', { name: 'Outgoing' })) + + await page.getByRole('button', { name: 'Expand stream details' }).first().click() + await expectReadableInteractiveStates(page, page.getByRole('button', { name: 'Update' })) + + await page.getByText('History').first().click() + await expectReadableInteractiveStates(page, page.getByRole('button', { name: 'Refresh' })) + await expectReadableInteractiveStates(page, page.getByRole('button', { name: 'Active' })) + + await gotoStory(page, 'create-update-success') + await expectReadableInteractiveStates(page, page.getByRole('button', { name: 'Reset' })) + + await gotoStory(page, 'pool-claim-state') + await expectReadableInteractiveStates( + page, + page.getByRole('button', { name: 'Connect', exact: true }), + ) + + await gotoStory(page, 'pool-connected-state') + await expectReadableInteractiveStates(page, page.getByRole('button', { name: 'Disconnect' })) + + await gotoStory(page, 'pool-claimable-amount-error') + const retry = page.getByRole('button', { name: 'Retry' }) + await retry.hover() + await saveScreenshot(page, 'sw-33-secondary-button-hover') + await expectReadableInteractiveStates(page, retry) + }) + }) +} diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-01-no-wallet.png b/tests/widgets/streaming-widget/test-results/dark/sw-01-no-wallet.png new file mode 100644 index 00000000..eacb08b6 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-01-no-wallet.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-02-tab-navigation.png b/tests/widgets/streaming-widget/test-results/dark/sw-02-tab-navigation.png new file mode 100644 index 00000000..feab8643 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-02-tab-navigation.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-03-wrong-chain.png b/tests/widgets/streaming-widget/test-results/dark/sw-03-wrong-chain.png new file mode 100644 index 00000000..3e8511a2 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-03-wrong-chain.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-04-loading-state.png b/tests/widgets/streaming-widget/test-results/dark/sw-04-loading-state.png new file mode 100644 index 00000000..ac247748 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-04-loading-state.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-05-empty-state.png b/tests/widgets/streaming-widget/test-results/dark/sw-05-empty-state.png new file mode 100644 index 00000000..48f85b57 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-05-empty-state.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-06-error-state.png b/tests/widgets/streaming-widget/test-results/dark/sw-06-error-state.png new file mode 100644 index 00000000..38f40725 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-06-error-state.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-07-populated-streams.png b/tests/widgets/streaming-widget/test-results/dark/sw-07-populated-streams.png new file mode 100644 index 00000000..8d755f16 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-07-populated-streams.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-08-create-update-invalid.png b/tests/widgets/streaming-widget/test-results/dark/sw-08-create-update-invalid.png new file mode 100644 index 00000000..05c7b86a Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-08-create-update-invalid.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-09-create-update-pending.png b/tests/widgets/streaming-widget/test-results/dark/sw-09-create-update-pending.png new file mode 100644 index 00000000..3a20d192 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-09-create-update-pending.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-10-create-update-success.png b/tests/widgets/streaming-widget/test-results/dark/sw-10-create-update-success.png new file mode 100644 index 00000000..1fcdf80c Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-10-create-update-success.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-11-create-update-failure.png b/tests/widgets/streaming-widget/test-results/dark/sw-11-create-update-failure.png new file mode 100644 index 00000000..226dd272 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-11-create-update-failure.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-12-pool-claim.png b/tests/widgets/streaming-widget/test-results/dark/sw-12-pool-claim.png new file mode 100644 index 00000000..2d874637 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-12-pool-claim.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-13-pool-claim-pending.png b/tests/widgets/streaming-widget/test-results/dark/sw-13-pool-claim-pending.png new file mode 100644 index 00000000..47c44669 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-13-pool-claim-pending.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-14-pool-claim-success.png b/tests/widgets/streaming-widget/test-results/dark/sw-14-pool-claim-success.png new file mode 100644 index 00000000..78cf4eee Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-14-pool-claim-success.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-15-pool-claim-error.png b/tests/widgets/streaming-widget/test-results/dark/sw-15-pool-claim-error.png new file mode 100644 index 00000000..f7d09fc3 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-15-pool-claim-error.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-16-base-sup-reserve.png b/tests/widgets/streaming-widget/test-results/dark/sw-16-base-sup-reserve.png new file mode 100644 index 00000000..c253dd69 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-16-base-sup-reserve.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-17-non-base-reserve-disabled.png b/tests/widgets/streaming-widget/test-results/dark/sw-17-non-base-reserve-disabled.png new file mode 100644 index 00000000..9cfc5fd0 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-17-non-base-reserve-disabled.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-18-mobile-populated.png b/tests/widgets/streaming-widget/test-results/dark/sw-18-mobile-populated.png new file mode 100644 index 00000000..771a66a9 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-18-mobile-populated.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-19-desktop-populated.png b/tests/widgets/streaming-widget/test-results/dark/sw-19-desktop-populated.png new file mode 100644 index 00000000..eec16fb6 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-19-desktop-populated.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-20-pool-claimable-amount-error.png b/tests/widgets/streaming-widget/test-results/dark/sw-20-pool-claimable-amount-error.png new file mode 100644 index 00000000..b6adbade Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-20-pool-claimable-amount-error.png differ diff --git a/tests/widgets/streaming-widget/test-results/sw-21-pool-claimable-retry-loading.png b/tests/widgets/streaming-widget/test-results/dark/sw-21-pool-claimable-retry-loading.png similarity index 100% rename from tests/widgets/streaming-widget/test-results/sw-21-pool-claimable-retry-loading.png rename to tests/widgets/streaming-widget/test-results/dark/sw-21-pool-claimable-retry-loading.png diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-22-stream-history-tab.png b/tests/widgets/streaming-widget/test-results/dark/sw-22-stream-history-tab.png new file mode 100644 index 00000000..9e7d5af0 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-22-stream-history-tab.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-23-pool-connected.png b/tests/widgets/streaming-widget/test-results/dark/sw-23-pool-connected.png new file mode 100644 index 00000000..4d62a583 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-23-pool-connected.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-24-stream-details-expanded.png b/tests/widgets/streaming-widget/test-results/dark/sw-24-stream-details-expanded.png new file mode 100644 index 00000000..e688e85f Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-24-stream-details-expanded.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-25-stream-details-collapsed.png b/tests/widgets/streaming-widget/test-results/dark/sw-25-stream-details-collapsed.png new file mode 100644 index 00000000..19fa292b Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-25-stream-details-collapsed.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-26-history-active-filter.png b/tests/widgets/streaming-widget/test-results/dark/sw-26-history-active-filter.png new file mode 100644 index 00000000..0d424a48 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-26-history-active-filter.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-27-history-ended-filter.png b/tests/widgets/streaming-widget/test-results/dark/sw-27-history-ended-filter.png new file mode 100644 index 00000000..d60c11e9 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-27-history-ended-filter.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-28-cancel-stream-pending.png b/tests/widgets/streaming-widget/test-results/dark/sw-28-cancel-stream-pending.png new file mode 100644 index 00000000..d1835fb4 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-28-cancel-stream-pending.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-29-cancel-stream-failure.png b/tests/widgets/streaming-widget/test-results/dark/sw-29-cancel-stream-failure.png new file mode 100644 index 00000000..263151ba Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-29-cancel-stream-failure.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-30-update-stream-form.png b/tests/widgets/streaming-widget/test-results/dark/sw-30-update-stream-form.png new file mode 100644 index 00000000..f897f8f6 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-30-update-stream-form.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-31-theme-overrides-playground.png b/tests/widgets/streaming-widget/test-results/dark/sw-31-theme-overrides-playground.png new file mode 100644 index 00000000..1cccc43f Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-31-theme-overrides-playground.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-32-wrong-chain-mobile.png b/tests/widgets/streaming-widget/test-results/dark/sw-32-wrong-chain-mobile.png new file mode 100644 index 00000000..4689bb53 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-32-wrong-chain-mobile.png differ diff --git a/tests/widgets/streaming-widget/test-results/dark/sw-33-secondary-button-hover.png b/tests/widgets/streaming-widget/test-results/dark/sw-33-secondary-button-hover.png new file mode 100644 index 00000000..b6adbade Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/dark/sw-33-secondary-button-hover.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-01-no-wallet.png b/tests/widgets/streaming-widget/test-results/light/sw-01-no-wallet.png new file mode 100644 index 00000000..9a33f432 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-01-no-wallet.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-02-tab-navigation.png b/tests/widgets/streaming-widget/test-results/light/sw-02-tab-navigation.png new file mode 100644 index 00000000..59c7f03a Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-02-tab-navigation.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-03-wrong-chain.png b/tests/widgets/streaming-widget/test-results/light/sw-03-wrong-chain.png new file mode 100644 index 00000000..06a07104 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-03-wrong-chain.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-04-loading-state.png b/tests/widgets/streaming-widget/test-results/light/sw-04-loading-state.png new file mode 100644 index 00000000..afb2c828 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-04-loading-state.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-05-empty-state.png b/tests/widgets/streaming-widget/test-results/light/sw-05-empty-state.png new file mode 100644 index 00000000..92b9d429 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-05-empty-state.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-06-error-state.png b/tests/widgets/streaming-widget/test-results/light/sw-06-error-state.png new file mode 100644 index 00000000..fc896d6a Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-06-error-state.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-07-populated-streams.png b/tests/widgets/streaming-widget/test-results/light/sw-07-populated-streams.png new file mode 100644 index 00000000..702f20d6 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-07-populated-streams.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-08-create-update-invalid.png b/tests/widgets/streaming-widget/test-results/light/sw-08-create-update-invalid.png new file mode 100644 index 00000000..3f575765 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-08-create-update-invalid.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-09-create-update-pending.png b/tests/widgets/streaming-widget/test-results/light/sw-09-create-update-pending.png new file mode 100644 index 00000000..a6b43ea7 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-09-create-update-pending.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-10-create-update-success.png b/tests/widgets/streaming-widget/test-results/light/sw-10-create-update-success.png new file mode 100644 index 00000000..b8f57264 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-10-create-update-success.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-11-create-update-failure.png b/tests/widgets/streaming-widget/test-results/light/sw-11-create-update-failure.png new file mode 100644 index 00000000..6797af9d Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-11-create-update-failure.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-12-pool-claim.png b/tests/widgets/streaming-widget/test-results/light/sw-12-pool-claim.png new file mode 100644 index 00000000..d74a801b Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-12-pool-claim.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-13-pool-claim-pending.png b/tests/widgets/streaming-widget/test-results/light/sw-13-pool-claim-pending.png new file mode 100644 index 00000000..c62a3cdf Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-13-pool-claim-pending.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-14-pool-claim-success.png b/tests/widgets/streaming-widget/test-results/light/sw-14-pool-claim-success.png new file mode 100644 index 00000000..4b4b0f39 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-14-pool-claim-success.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-15-pool-claim-error.png b/tests/widgets/streaming-widget/test-results/light/sw-15-pool-claim-error.png new file mode 100644 index 00000000..4895f262 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-15-pool-claim-error.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-16-base-sup-reserve.png b/tests/widgets/streaming-widget/test-results/light/sw-16-base-sup-reserve.png new file mode 100644 index 00000000..72954f29 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-16-base-sup-reserve.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-17-non-base-reserve-disabled.png b/tests/widgets/streaming-widget/test-results/light/sw-17-non-base-reserve-disabled.png new file mode 100644 index 00000000..56e8f1e3 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-17-non-base-reserve-disabled.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-18-mobile-populated.png b/tests/widgets/streaming-widget/test-results/light/sw-18-mobile-populated.png new file mode 100644 index 00000000..1ad76c35 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-18-mobile-populated.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-19-desktop-populated.png b/tests/widgets/streaming-widget/test-results/light/sw-19-desktop-populated.png new file mode 100644 index 00000000..0a5191ee Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-19-desktop-populated.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-20-pool-claimable-amount-error.png b/tests/widgets/streaming-widget/test-results/light/sw-20-pool-claimable-amount-error.png new file mode 100644 index 00000000..5b477802 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-20-pool-claimable-amount-error.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-21-pool-claimable-retry-loading.png b/tests/widgets/streaming-widget/test-results/light/sw-21-pool-claimable-retry-loading.png new file mode 100644 index 00000000..62bc0340 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-21-pool-claimable-retry-loading.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-22-stream-history-tab.png b/tests/widgets/streaming-widget/test-results/light/sw-22-stream-history-tab.png new file mode 100644 index 00000000..2c1a24a6 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-22-stream-history-tab.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-23-pool-connected.png b/tests/widgets/streaming-widget/test-results/light/sw-23-pool-connected.png new file mode 100644 index 00000000..5a92892c Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-23-pool-connected.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-24-stream-details-expanded.png b/tests/widgets/streaming-widget/test-results/light/sw-24-stream-details-expanded.png new file mode 100644 index 00000000..68f30d56 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-24-stream-details-expanded.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-25-stream-details-collapsed.png b/tests/widgets/streaming-widget/test-results/light/sw-25-stream-details-collapsed.png new file mode 100644 index 00000000..fdfa66c6 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-25-stream-details-collapsed.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-26-history-active-filter.png b/tests/widgets/streaming-widget/test-results/light/sw-26-history-active-filter.png new file mode 100644 index 00000000..da23ed76 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-26-history-active-filter.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-27-history-ended-filter.png b/tests/widgets/streaming-widget/test-results/light/sw-27-history-ended-filter.png new file mode 100644 index 00000000..b07d3416 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-27-history-ended-filter.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-28-cancel-stream-pending.png b/tests/widgets/streaming-widget/test-results/light/sw-28-cancel-stream-pending.png new file mode 100644 index 00000000..b1d89370 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-28-cancel-stream-pending.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-29-cancel-stream-failure.png b/tests/widgets/streaming-widget/test-results/light/sw-29-cancel-stream-failure.png new file mode 100644 index 00000000..850a430c Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-29-cancel-stream-failure.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-30-update-stream-form.png b/tests/widgets/streaming-widget/test-results/light/sw-30-update-stream-form.png new file mode 100644 index 00000000..523c8a66 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-30-update-stream-form.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-31-theme-overrides-playground.png b/tests/widgets/streaming-widget/test-results/light/sw-31-theme-overrides-playground.png new file mode 100644 index 00000000..65ed7897 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-31-theme-overrides-playground.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-32-wrong-chain-mobile.png b/tests/widgets/streaming-widget/test-results/light/sw-32-wrong-chain-mobile.png new file mode 100644 index 00000000..8057d700 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-32-wrong-chain-mobile.png differ diff --git a/tests/widgets/streaming-widget/test-results/light/sw-33-secondary-button-hover.png b/tests/widgets/streaming-widget/test-results/light/sw-33-secondary-button-hover.png new file mode 100644 index 00000000..5b477802 Binary files /dev/null and b/tests/widgets/streaming-widget/test-results/light/sw-33-secondary-button-hover.png differ diff --git a/tests/widgets/streaming-widget/test-results/sw-01-no-wallet.png b/tests/widgets/streaming-widget/test-results/sw-01-no-wallet.png deleted file mode 100644 index 1b106c79..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-01-no-wallet.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-02-tab-navigation.png b/tests/widgets/streaming-widget/test-results/sw-02-tab-navigation.png deleted file mode 100644 index dcb12baf..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-02-tab-navigation.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-03-wrong-chain.png b/tests/widgets/streaming-widget/test-results/sw-03-wrong-chain.png deleted file mode 100644 index 33d2563d..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-03-wrong-chain.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-04-loading-state.png b/tests/widgets/streaming-widget/test-results/sw-04-loading-state.png deleted file mode 100644 index e1b8972a..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-04-loading-state.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-05-empty-state.png b/tests/widgets/streaming-widget/test-results/sw-05-empty-state.png deleted file mode 100644 index 67ad3830..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-05-empty-state.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-06-error-state.png b/tests/widgets/streaming-widget/test-results/sw-06-error-state.png deleted file mode 100644 index 43315a5a..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-06-error-state.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-07-populated-streams.png b/tests/widgets/streaming-widget/test-results/sw-07-populated-streams.png deleted file mode 100644 index 77cc4636..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-07-populated-streams.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-08-create-update-invalid.png b/tests/widgets/streaming-widget/test-results/sw-08-create-update-invalid.png deleted file mode 100644 index 5892eac0..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-08-create-update-invalid.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-09-create-update-pending.png b/tests/widgets/streaming-widget/test-results/sw-09-create-update-pending.png deleted file mode 100644 index 7d15fba3..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-09-create-update-pending.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-10-create-update-success.png b/tests/widgets/streaming-widget/test-results/sw-10-create-update-success.png deleted file mode 100644 index 08f1b279..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-10-create-update-success.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-11-create-update-failure.png b/tests/widgets/streaming-widget/test-results/sw-11-create-update-failure.png deleted file mode 100644 index 7b52102e..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-11-create-update-failure.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-12-pool-claim.png b/tests/widgets/streaming-widget/test-results/sw-12-pool-claim.png deleted file mode 100644 index c471a003..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-12-pool-claim.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-13-pool-claim-pending.png b/tests/widgets/streaming-widget/test-results/sw-13-pool-claim-pending.png deleted file mode 100644 index fe4d927b..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-13-pool-claim-pending.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-14-pool-claim-success.png b/tests/widgets/streaming-widget/test-results/sw-14-pool-claim-success.png deleted file mode 100644 index 30bda1f4..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-14-pool-claim-success.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-15-pool-claim-error.png b/tests/widgets/streaming-widget/test-results/sw-15-pool-claim-error.png deleted file mode 100644 index b5a623ca..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-15-pool-claim-error.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-16-base-sup-reserve.png b/tests/widgets/streaming-widget/test-results/sw-16-base-sup-reserve.png deleted file mode 100644 index 081832c1..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-16-base-sup-reserve.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-17-non-base-reserve-disabled.png b/tests/widgets/streaming-widget/test-results/sw-17-non-base-reserve-disabled.png deleted file mode 100644 index dada7456..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-17-non-base-reserve-disabled.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-18-mobile-populated.png b/tests/widgets/streaming-widget/test-results/sw-18-mobile-populated.png deleted file mode 100644 index d701b468..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-18-mobile-populated.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-19-desktop-populated.png b/tests/widgets/streaming-widget/test-results/sw-19-desktop-populated.png deleted file mode 100644 index cfb8bf11..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-19-desktop-populated.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-20-pool-claimable-amount-error.png b/tests/widgets/streaming-widget/test-results/sw-20-pool-claimable-amount-error.png deleted file mode 100644 index 2385160d..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-20-pool-claimable-amount-error.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-22-stream-history-tab.png b/tests/widgets/streaming-widget/test-results/sw-22-stream-history-tab.png deleted file mode 100644 index ebed61d0..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-22-stream-history-tab.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-23-pool-connected.png b/tests/widgets/streaming-widget/test-results/sw-23-pool-connected.png deleted file mode 100644 index 87e1a7af..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-23-pool-connected.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-24-stream-details-expanded.png b/tests/widgets/streaming-widget/test-results/sw-24-stream-details-expanded.png deleted file mode 100644 index 555eab28..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-24-stream-details-expanded.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-25-stream-details-collapsed.png b/tests/widgets/streaming-widget/test-results/sw-25-stream-details-collapsed.png deleted file mode 100644 index 4f70f180..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-25-stream-details-collapsed.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-26-history-active-filter.png b/tests/widgets/streaming-widget/test-results/sw-26-history-active-filter.png deleted file mode 100644 index 5fa0fade..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-26-history-active-filter.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-27-history-ended-filter.png b/tests/widgets/streaming-widget/test-results/sw-27-history-ended-filter.png deleted file mode 100644 index 7e37cf03..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-27-history-ended-filter.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-28-cancel-stream-pending.png b/tests/widgets/streaming-widget/test-results/sw-28-cancel-stream-pending.png deleted file mode 100644 index 5ca8a7ab..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-28-cancel-stream-pending.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-29-cancel-stream-failure.png b/tests/widgets/streaming-widget/test-results/sw-29-cancel-stream-failure.png deleted file mode 100644 index 29bad589..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-29-cancel-stream-failure.png and /dev/null differ diff --git a/tests/widgets/streaming-widget/test-results/sw-30-update-stream-form.png b/tests/widgets/streaming-widget/test-results/sw-30-update-stream-form.png deleted file mode 100644 index 52158c4b..00000000 Binary files a/tests/widgets/streaming-widget/test-results/sw-30-update-stream-form.png and /dev/null differ