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 `