From 9032a631e7971abf50b8b4a240426f484aa96f6d Mon Sep 17 00:00:00 2001 From: "goodbounties-nanoclaw-agent[bot]" <307944451+goodbounties-nanoclaw-agent[bot]@users.noreply.github.com> Date: Wed, 14 Oct 2026 10:25:19 +0000 Subject: [PATCH] [BountyCoder] feat(storybook): showcase all GoodWidget widgets with QA fixtures and theme overrides Adds the Showcase/Theme-overrides/QA three-way story split to CitizenClaimWidget, GoodReserveWidget, GovernanceWidget, AiCreditsWidget, SuperfluidCampaignWidget, and GoodDataWidget per issue #252, including MDX integrator docs and deterministic QA fixtures backing each widget's Playwright states spec. Co-Authored-By: Claude On-Behalf-Of: BountyCoder[onecli] (yaskkeryodtdijpv) --- .../ai-credits-widget/AiCreditsWidget.mdx | 36 ++- .../AiCreditsWidgetQA.stories.tsx | 7 + .../AiCreditsWidgetShowcase.stories.tsx | 6 - .../AiCreditsWidgetThemeOverrides.stories.tsx | 251 ++++++++++++++++++ .../CitizenClaimWidget.mdx | 10 +- .../CitizenClaimWidgetShowcase.stories.tsx | 22 +- ...tizenClaimWidgetThemeOverrides.stories.tsx | 206 ++++++++++++++ .../gooddata-widget/GoodDataWidget.mdx | 48 ++++ .../GoodDataWidgetQA.stories.tsx | 2 +- .../GoodDataWidgetShowcase.stories.tsx | 19 ++ .../GoodDataWidgetThemeOverrides.stories.tsx | 198 ++++++++++++++ .../goodreserve-widget/GoodReserveWidget.mdx | 97 +++++++ .../GoodReserveWidgetQA.stories.tsx | 120 +++++++++ ... => GoodReserveWidgetShowcase.stories.tsx} | 116 +------- ...oodReserveWidgetThemeOverrides.stories.tsx | 187 +++++++++++++ .../GovernanceOnboarding.stories.tsx | 4 +- .../governance-widget/GovernanceWidget.mdx | 5 + .../helpers/citizenClaimWidgetStories.tsx | 14 +- .../stories/helpers/goodDataWidgetStories.tsx | 20 +- .../SuperfluidCampaignWidget.mdx | 8 + ...luidCampaignWidgetApiContracts.stories.tsx | 2 +- ...idCampaignWidgetThemeOverrides.stories.tsx | 183 +++++++++++++ tests/widgets/gooddata-widget/states.spec.ts | 10 +- .../widgets/goodreserve-widget/states.spec.ts | 38 +-- .../governance-widget/onboarding.spec.ts | 16 +- .../superfluid-campaign-widget/states.spec.ts | 4 +- 26 files changed, 1455 insertions(+), 174 deletions(-) create mode 100644 examples/storybook/src/stories/ai-credits-widget/AiCreditsWidgetThemeOverrides.stories.tsx create mode 100644 examples/storybook/src/stories/citizen-claim-widget/CitizenClaimWidgetThemeOverrides.stories.tsx create mode 100644 examples/storybook/src/stories/gooddata-widget/GoodDataWidget.mdx create mode 100644 examples/storybook/src/stories/gooddata-widget/GoodDataWidgetShowcase.stories.tsx create mode 100644 examples/storybook/src/stories/gooddata-widget/GoodDataWidgetThemeOverrides.stories.tsx create mode 100644 examples/storybook/src/stories/goodreserve-widget/GoodReserveWidget.mdx create mode 100644 examples/storybook/src/stories/goodreserve-widget/GoodReserveWidgetQA.stories.tsx rename examples/storybook/src/stories/goodreserve-widget/{GoodReserveWidget.stories.tsx => GoodReserveWidgetShowcase.stories.tsx} (52%) create mode 100644 examples/storybook/src/stories/goodreserve-widget/GoodReserveWidgetThemeOverrides.stories.tsx create mode 100644 examples/storybook/src/stories/superfluid-campaign-widget/SuperfluidCampaignWidgetThemeOverrides.stories.tsx diff --git a/examples/storybook/src/stories/ai-credits-widget/AiCreditsWidget.mdx b/examples/storybook/src/stories/ai-credits-widget/AiCreditsWidget.mdx index edcc07da..6bb89449 100644 --- a/examples/storybook/src/stories/ai-credits-widget/AiCreditsWidget.mdx +++ b/examples/storybook/src/stories/ai-credits-widget/AiCreditsWidget.mdx @@ -1,5 +1,6 @@ import { Canvas, Meta } from '@storybook/blocks'; import * as ShowcaseStories from './AiCreditsWidgetShowcase.stories'; +import * as ThemeOverridesStories from './AiCreditsWidgetThemeOverrides.stories'; import { DocsCallout, DocsCard, DocsGrid, DocsPage, DocsSection } from '../docs/DocsLayout'; @@ -10,29 +11,38 @@ import { DocsCallout, DocsCard, DocsGrid, DocsPage, DocsSection } from '../docs/ lead="Buy AI coding credits with G$ on Celo. Credits settle on Base and are redeemable with AntSeed-compatible AI coding tools like Cursor and Cline." > - + - + - - All QA fixture states as deterministic mock stories — ideal for automation and debugging. - + + + All QA fixture states as deterministic mock stories — ideal for automation and debugging. + + + Browser wallet (`window.ethereum`) with the in-memory mock backend — no local antseed worker + required. + + , } +/** Backend mocked, wallet is whatever EIP-1193 extension is injected in the browser. */ +export const MockBackend: Story = { + name: 'Mock Backend (browser wallet)', + render: () => , +} + /** Multi-signer manage tab: signer selector and private-key reveal. */ export const MultiSignerManage: Story = { render: () => , diff --git a/examples/storybook/src/stories/ai-credits-widget/AiCreditsWidgetShowcase.stories.tsx b/examples/storybook/src/stories/ai-credits-widget/AiCreditsWidgetShowcase.stories.tsx index 0fdff0bb..bfc19c10 100644 --- a/examples/storybook/src/stories/ai-credits-widget/AiCreditsWidgetShowcase.stories.tsx +++ b/examples/storybook/src/stories/ai-credits-widget/AiCreditsWidgetShowcase.stories.tsx @@ -2,7 +2,6 @@ import type { Meta, StoryObj } from '@storybook/react' import { AiCreditsWidget } from '@goodwidget/ai-credits-widget' import { InjectedWalletStory, - MockBackendStory, AppKitConnectWalletStory, } from '../helpers/aiCreditsWidgetStories' @@ -22,11 +21,6 @@ const meta: Meta = { export default meta type Story = StoryObj -export const MockBackend: Story = { - name: 'Mock Backend (browser wallet)', - render: () => , -} - export const InjectedWallet: Story = { name: 'Injected Wallet', render: () => , diff --git a/examples/storybook/src/stories/ai-credits-widget/AiCreditsWidgetThemeOverrides.stories.tsx b/examples/storybook/src/stories/ai-credits-widget/AiCreditsWidgetThemeOverrides.stories.tsx new file mode 100644 index 00000000..3e60bd17 --- /dev/null +++ b/examples/storybook/src/stories/ai-credits-widget/AiCreditsWidgetThemeOverrides.stories.tsx @@ -0,0 +1,251 @@ +/** + * AiCreditsWidget — Theme Overrides — demonstrates the widget's primitive + * theming surface (`Card`/`Button` from `packages/ui`) as live color-picker + * controls, following the StreamingWidget/GoodReserveWidget Theme overrides + * pattern for structure (CodeBlock + DocsCallout + live Canvas). + * + * This widget's own named sub-components — `AiCreditsStatusNotice`, + * `BonusBadgeFrame` (see packages/ai-credits-widget/src/components/theme/cards.ts) + * — have no dedicated `light_*`/`dark_*` presets in packages/ui/src/presets.ts + * (confirmed via grep), so they correctly cascade from the plain `Card`/`Button` + * theme instead of overriding it. A `dark_Card`/`dark_Button` override is NOT a + * no-op here. + * + * The quote-ready state is used because it renders the plain `Card` used by + * `AiCreditsHero` (packages/ai-credits-widget/src/components/buy/AiCreditsHero.tsx) + * alongside the plain primary `