Skip to content

Add Storybook baseline for UI primitives#807

Merged
Chris0Jeky merged 13 commits intomainfrom
feature/storybook-baseline
Apr 12, 2026
Merged

Add Storybook baseline for UI primitives#807
Chris0Jeky merged 13 commits intomainfrom
feature/storybook-baseline

Conversation

@Chris0Jeky
Copy link
Copy Markdown
Owner

Summary

Closes #251

  • Install and configure Storybook 10.3 (latest stable compatible with project's Vite 8) for Vue 3 + TypeScript
  • Add stories for all 17 Td* UI primitives showing key state variants, covering buttons, form inputs, overlays, feedback, and data display categories
  • Add npm run storybook (dev server on :6006) and npm run storybook:build scripts
  • Strip PWA plugin from Storybook's Vite config to prevent workbox precache errors during builds

Components covered (17 total)

  • Buttons: TdButton (4 variants, 3 sizes, disabled, loading), TdIconButton
  • Form inputs: TdInput, TdTextarea, TdSelect, TdFieldWrapper (with composed examples)
  • Overlays: TdDialog, TdDropdown, TdPopover, TdTooltip (positional variants)
  • Feedback: TdToast, TdInlineAlert (4 semantic variants each), TdSpinner (3 sizes), TdSkeleton (composed card layout)
  • Data display: TdBadge (6 variants, 2 sizes), TdTag (custom colors, removable), TdEmptyState (with icon/action slots)

Storybook version note

The issue requested Storybook 8.x, but Storybook 8 only supports Vite up to v6. Since this project uses Vite 8, Storybook 10.3.x is required (first version with Vite 8 peer dependency support). The API surface and story format (CSF3 with satisfies) are the same.

Maintenance expectations

  • Each Td* primitive should have a co-located story in src/stories/
  • When adding or modifying a Td* component's props/variants, update the corresponding story
  • npm run storybook:build can be added to CI to catch rendering regressions

Test plan

  • npm run typecheck passes
  • npm run build (production build) passes -- no regression
  • npm run lint passes
  • npm run storybook:build completes successfully
  • Manual: npm run storybook launches dev server and all stories render

Install storybook and @storybook/vue3-vite (10.3.x for Vite 8
compatibility). Add storybook and storybook:build npm scripts.
Configure .storybook/main.ts with vue3-vite framework, vue-component-meta
docgen, and a viteFinal hook that strips the PWA plugin to prevent workbox
precache errors during Storybook builds.

Configure .storybook/preview.ts to import design tokens and set dark
obsidian background as default to match the app theme.
Cover all variants (primary, secondary, ghost, danger), all sizes
(sm, md, lg), disabled, loading states, and combined galleries.
…ldWrapper)

Cover default, value, error, disabled, readonly states and a composed
form example using TdFieldWrapper with TdInput.
…TdTooltip)

Cover interactive open/close, positional variants, alignment options,
and backdrop behavior.
…r, TdSkeleton)

Cover all semantic variants (info, success, warning, error), sizes,
dismissible state, and a composed skeleton card layout.
Cover all badge variants and sizes, tag colors and removable state,
and empty state with icon/action slots.
Copilot AI review requested due to automatic review settings April 9, 2026 18:08
The previous approach stripped all array-type Vite plugins. Now it
inspects array members for PWA-related names before deciding to drop.
@Chris0Jeky
Copy link
Copy Markdown
Owner Author

Adversarial Self-Review

CRITICAL findings

None.

HIGH findings

  1. [FIXED] stripPwaPlugins was too aggressive -- The original implementation stripped ALL array-type Vite plugins (if (Array.isArray(plugin)) return false), not just PWA-related ones. Other Vite plugins may also return arrays of sub-plugins. Fixed in commit 7d8b397 to inspect array members for PWA-related names before deciding to drop.

MEDIUM findings

  1. Storybook 10.3 instead of 8.x -- The issue requested Storybook 8.x, but Storybook 8 only supports Vite up to v6, while the project uses Vite 8. Storybook 10.3 is the first release with vite@^8.0.0 peer dependency support. The CSF3 story format and API surface are identical. Documented in the PR description.

  2. No CI integration for storybook:build -- The PR adds the build script but does not add it to CI workflows. This is intentional to keep scope focused; CI integration can be a follow-up.

LOW findings

  1. Stories are in src/stories/ not co-located with components -- Stories live in src/stories/TdButton.stories.ts rather than alongside components at src/components/ui/TdButton.stories.ts. Both patterns are common. The centralized location keeps the component directory clean and makes the stories glob simpler. Either works; this could be changed later if the team prefers co-location.

  2. Storybook tsconfig not explicitly isolated -- Story files are included in the app's tsconfig.app.json (src/**/*.ts). This works because story files only import components and Storybook types (all devDependencies). No runtime code paths are affected. If this becomes a concern, stories can be excluded via tsconfig.app.json's exclude array.

  3. Chunk size warnings -- The Storybook build produces chunks >500KB. This is normal for Storybook builds (the manager bundle is always large) and does not affect the production app build.

Verification results

  • npm run typecheck -- PASS
  • npm run build -- PASS (no regression)
  • npm run lint -- PASS
  • npm run storybook:build -- PASS

@Chris0Jeky
Copy link
Copy Markdown
Owner Author

Self-Review Fix Summary

HIGH #1 fixed in commit 7d8b397: stripPwaPlugins now inspects array plugin members for PWA-related names instead of dropping all array-type plugins indiscriminately.

All checks re-verified after the fix:

  • npm run typecheck -- PASS
  • npm run build -- PASS
  • npm run lint -- PASS
  • npm run storybook:build -- PASS

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a Storybook baseline to document and visually validate Taskdeck’s Vue 3 UI primitives, including configuration, scripts, and initial stories for each primitive.

Changes:

  • Added Storybook (Vue 3 + Vite) configuration under .storybook/ and wired design tokens into the preview.
  • Added 17 CSF stories under src/stories/ covering state/variant examples for each Td* primitive.
  • Updated frontend workspace scripts/deps to run and build Storybook; ignored storybook-static output.

Reviewed changes

Copilot reviewed 21 out of 22 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
frontend/taskdeck-web/.storybook/main.ts Adds Storybook config and custom Vite plugin stripping logic.
frontend/taskdeck-web/.storybook/preview.ts Sets global preview parameters + decorator and imports design tokens.
frontend/taskdeck-web/src/stories/TdBadge.stories.ts Badge variant/size stories.
frontend/taskdeck-web/src/stories/TdButton.stories.ts Button variant/size/disabled/loading stories.
frontend/taskdeck-web/src/stories/TdDialog.stories.ts Dialog open/variant examples.
frontend/taskdeck-web/src/stories/TdDropdown.stories.ts Dropdown open/alignment examples.
frontend/taskdeck-web/src/stories/TdEmptyState.stories.ts Empty state slot + description/action examples.
frontend/taskdeck-web/src/stories/TdFieldWrapper.stories.ts Field wrapper composed examples with input.
frontend/taskdeck-web/src/stories/TdIconButton.stories.ts Icon button variant/size/loading/disabled examples.
frontend/taskdeck-web/src/stories/TdInlineAlert.stories.ts Inline alert variants + dismissible examples.
frontend/taskdeck-web/src/stories/TdInput.stories.ts Input types + error/disabled/readonly examples.
frontend/taskdeck-web/src/stories/TdPopover.stories.ts Popover open/alignment/position examples.
frontend/taskdeck-web/src/stories/TdSelect.stories.ts Select placeholder/disabled/error/selection examples.
frontend/taskdeck-web/src/stories/TdSkeleton.stories.ts Skeleton shapes + composed layout example.
frontend/taskdeck-web/src/stories/TdSpinner.stories.ts Spinner sizes + label examples.
frontend/taskdeck-web/src/stories/TdTag.stories.ts Tag custom color + removable examples.
frontend/taskdeck-web/src/stories/TdTextarea.stories.ts Textarea rows + error/disabled/readonly examples.
frontend/taskdeck-web/src/stories/TdToast.stories.ts Toast variants + dismissibility examples.
frontend/taskdeck-web/src/stories/TdTooltip.stories.ts Tooltip positional + delay examples.
frontend/taskdeck-web/package.json Adds Storybook scripts and dev dependencies.
frontend/taskdeck-web/package-lock.json Locks Storybook dependency graph.
frontend/taskdeck-web/.gitignore Ignores built Storybook output directory.
Files not reviewed (1)
  • frontend/taskdeck-web/package-lock.json: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +3 to +16
function isPwaPlugin(plugin: unknown): boolean {
if (plugin && typeof plugin === 'object' && 'name' in plugin) {
const name = (plugin as { name: string }).name
return name.includes('pwa') || name.includes('workbox') || name.includes('PWA')
}
return false
}

function stripPwaPlugins(plugins: unknown[]): unknown[] {
return plugins.filter((plugin) => {
// Some Vite plugins (including VitePWA) return arrays of sub-plugins.
// Check each element to decide whether the whole array should be dropped.
if (Array.isArray(plugin)) {
return !plugin.some(isPwaPlugin)
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

stripPwaPlugins currently drops any plugin entries that are arrays (Array.isArray(plugin) => false). Vite plugins other than the PWA plugin can also be returned as arrays, so this risks unintentionally removing non-PWA functionality from the Storybook Vite config. Consider recursively filtering nested plugin arrays (or flattening config.plugins) and only removing plugins whose name matches the PWA/workbox patterns, while preserving other array-contained plugins.

Copilot uses AI. Check for mistakes.
Comment on lines +6 to +25
const meta = {
title: 'UI Primitives/TdPopover',
component: TdPopover,
tags: ['autodocs'],
argTypes: {
open: { control: 'boolean' },
align: {
control: 'select',
options: ['left', 'right', 'center'],
},
position: {
control: 'select',
options: ['top', 'bottom'],
},
},
args: {
open: false,
align: 'left',
position: 'bottom',
},
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This story sets argTypes/args (including open, align, position), but the story render implementations don't consume args (they use an internal isOpen ref and hard-coded props). As a result, Storybook Controls for these props won't work and the docs panel will be misleading. Either wire args into the render (e.g., bind open/align/position from args and update args.open on @close), or remove the unused controls from argTypes/args.

Copilot uses AI. Check for mistakes.
Comment on lines +6 to +20
const meta = {
title: 'UI Primitives/TdDropdown',
component: TdDropdown,
tags: ['autodocs'],
argTypes: {
open: { control: 'boolean' },
align: {
control: 'select',
options: ['left', 'right'],
},
},
args: {
open: false,
align: 'left',
},
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This story defines argTypes/args for open and align, but the render blocks don't use args (they manage isOpen locally and hard-code align). This makes the Controls panel ineffective for these props. Suggest either binding args into the template (and syncing args.open on @close) or removing the unused argTypes entries.

Copilot uses AI. Check for mistakes.
Comment on lines +6 to +21
const meta = {
title: 'UI Primitives/TdDialog',
component: TdDialog,
tags: ['autodocs'],
argTypes: {
open: { control: 'boolean' },
title: { control: 'text' },
description: { control: 'text' },
closeOnBackdrop: { control: 'boolean' },
},
args: {
open: false,
title: 'Confirm Action',
description: 'Are you sure you want to proceed?',
closeOnBackdrop: true,
},
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

argTypes/args are defined for open, title, description, and closeOnBackdrop, but the stories render hard-coded values and a local isOpen ref instead of consuming args. This means Storybook Controls won't actually affect the rendered dialog and autodocs will be out of sync. Consider binding args into the template and updating args.open on @close, or remove the unused controls.

Copilot uses AI. Check for mistakes.
Comment on lines +62 to +69

export const ErrorBadge: Story = {
args: { variant: 'error' },
render: (args) => ({
components: { TdBadge },
setup() { return { args } },
template: '<TdBadge v-bind="args">Failed</TdBadge>',
}),
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Story export name ErrorBadge is inconsistent with the other variant stories (Default, Primary, Success, Warning, Info). Renaming it to Error would keep the story list consistent and easier to scan.

Copilot uses AI. Check for mistakes.
Comment on lines +30 to +32
"mutation:test": "npx stryker run",
"storybook": "storybook dev -p 6006",
"storybook:build": "storybook build -o storybook-static"
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR description/issue acceptance criteria mention documenting Storybook ownership/maintenance expectations in active docs, but this PR only adds configuration/scripts/stories and doesn't appear to update any documentation (no Storybook references found in workspace markdown). If docs are still required for #251, please add/update the relevant doc(s) and link from the README or existing quality gate docs.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7130d4403a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +6 to +7
if (Array.isArray(plugin)) {
return false // PWA returns an array; but be safe, check names
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve non-PWA plugin arrays when filtering plugins

stripPwaPlugins currently drops every array entry in config.plugins, not just PWA-related plugins. Vite plugins commonly return Plugin[], so any future non-PWA array plugin (or an existing one from Storybook internals) would be silently removed and its transforms/hooks would stop running in Storybook builds. This makes the Storybook config brittle and can cause hard-to-diagnose build/runtime failures as soon as another array-based plugin is introduced.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request integrates Storybook into the frontend project by adding the necessary configuration files, updating dependencies in package.json, and creating story files for various UI components. My review identified two improvements: defining a specific interface for Vite plugins to enhance type safety and updating the viteFinal configuration to treat the configuration object as immutable, preventing potential side effects.

Comment on lines +31 to +33
// Strip PWA plugin — it is app-specific and breaks the Storybook build
// because the Storybook output includes large JS bundles that exceed
// the workbox precache size limit.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The viteFinal configuration directly mutates the config.plugins array. It is safer to treat the configuration object as immutable and return a new object to avoid potential side effects in the Vite build pipeline.

Suggested change
// Strip PWA plugin — it is app-specific and breaks the Storybook build
// because the Storybook output includes large JS bundles that exceed
// the workbox precache size limit.
return {
...config,
plugins: config.plugins ? stripPwaPlugins(config.plugins as unknown[]) : config.plugins,
}

@Chris0Jeky
Copy link
Copy Markdown
Owner Author

Independent Adversarial Review (Round 2)

Reviewed all 22 changed files (config, package.json, 17 stories) against their corresponding components and the broader codebase.


MEDIUM Findings

M1. Missing ADR for Storybook version selection (.storybook/main.ts, PR-wide)
CLAUDE.md requires ADRs for "technology selections" that "choose between competing approaches." The issue (#251) specified Storybook 8.x; the PR delivers 10.3.x due to Vite 8 peer dependency constraints. This is a defensible decision, but it should be documented in an ADR per project conventions. A future contributor encountering Storybook 10 will wonder why 8.x was not used, and the reasoning (Vite 8 compat) will be lost.

M2. Storybook preview imports only design-tokens.css, not the full style.css (.storybook/preview.ts:2)
preview.ts imports ../src/design-tokens.css but not ../src/style.css. style.css defines global .td-btn, .td-btn--primary, etc. classes (lines 115-152) using Tailwind utilities inside @layer components. In production, both scoped (from .vue files) and global styles apply simultaneously. In Storybook, only the scoped styles render. This means Storybook will show components with slightly different styling than what users see in the real app -- the scoped styles use raw CSS custom properties while the global styles use Tailwind @apply directives that may produce different specificity/values. This undermines the core purpose of Storybook (visual fidelity).

Importing style.css wholesale would pull in Tailwind and the full app stylesheet. The better fix may be to restructure these duplicated class definitions, but for this PR, at minimum the discrepancy should be documented with a TODO.

M3. Variable shadowing in viteFinal callback (.storybook/main.ts:30)
The viteFinal(config) parameter name shadows the outer const config: StorybookConfig on line 22. This won't cause a runtime bug (the callback receives the Vite config, not the Storybook config), but it's confusing when reading the code and a lint-unfriendly pattern. Renaming the parameter to viteConfig would eliminate ambiguity.

M4. Story files included in app's TypeScript compilation (tsconfig.app.json:15)
tsconfig.app.json includes src/**/*.ts which captures src/stories/*.stories.ts. This means @storybook/vue3-vite types must be resolved during vue-tsc -b (the production typecheck). If Storybook's peer dependencies ever fall out of sync, the production typecheck will break even though stories are not production code. Adding "src/stories/**" to the exclude array would isolate the compilation.

LOW Findings

L1. No CI guard for storybook:build (ci-required.yml)
The PR adds npm run storybook:build but does not add it to any CI workflow. Story rendering regressions will go undetected until someone runs it locally. The self-review acknowledged this, and scoping it as follow-up is reasonable, but it means the stories could silently break on the next component change.

L2. Docker build will install Storybook devDependencies (deploy/docker/frontend.Dockerfile:6)
npm ci in the frontend Dockerfile installs all devDependencies (including Storybook's ~1790 new lockfile entries). Only dist/ is copied to the runtime image so production is unaffected, but the build stage gets slower and larger. Consider npm ci --omit=dev or a multi-stage approach in a follow-up to prune dev deps from Docker builds.

L3. Stories not co-located with components (src/stories/ vs src/components/ui/)
Stories live in a separate src/stories/ directory rather than alongside components. The self-review noted this; either pattern works. The risk is maintenance drift: when a developer modifies a component's props in src/components/ui/, they may not know to update the story in a different directory. Co-location makes the coupling visible.

L4. Potential Storybook backgrounds API deprecation (.storybook/preview.ts:7-13)
The backgrounds parameter uses { default, values } syntax. Storybook's backgrounds API has changed across major versions. Since this builds successfully on 10.3, it works now, but this API surface should be monitored during upgrades.

INFO Findings

I1. CI failure on API Integration / windows-latest is unrelated
The failing check is a vstest protocol negotiation timeout ("Failed to negotiate protocol, waiting for response timed out after 90 seconds"), a known Windows CI flaky infrastructure issue. Not caused by this PR.

I2. All 17 component stories have correct prop types
Cross-checked every story's argTypes, args, and template bindings against the actual component props. All match the component definitions. Well done.

I3. storybook-static properly gitignored
The .gitignore entry is correctly placed.


Summary

  • 0 CRITICAL, 0 HIGH, 4 MEDIUM, 4 LOW, 3 INFO findings

The PR is clean from a build-safety and correctness standpoint. None of the findings block merge. The most actionable items are M2 (style fidelity gap) and M4 (tsconfig isolation), which represent real maintenance risks that could bite later. Consider addressing them in follow-up work.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 23a545ba67

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +81 to +82
export const NoBackdropClose: Story = {
render: (args) => ({
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Set closeOnBackdrop false for NoBackdropClose story

NoBackdropClose inherits the meta default closeOnBackdrop: true, so backdrop clicks still dismiss the dialog and the story never demonstrates the non-dismissible behavior it is named for. This makes Storybook documentation misleading and weakens regression coverage for dialogs that must require explicit user acknowledgement.

Useful? React with 👍 / 👎.

Comment on lines +46 to +47
export const AlignRight: Story = {
render: (args) => ({
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Set right alignment args in AlignRight dropdown story

AlignRight does not override align, so it keeps the meta default 'left' and renders the same alignment as the default story. This removes intended coverage for right-edge positioning and can hide regressions where right-aligned dropdown panels clip or anchor incorrectly.

Useful? React with 👍 / 👎.

Comment on lines +51 to +52
export const TopPosition: Story = {
render: (args) => ({
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Set top position args in TopPosition popover story

TopPosition does not provide args.position = 'top', so it inherits the meta default 'bottom' and never exercises the top-placement path. That leaves the top-position variant effectively untested in Storybook and can mask placement/animation regressions for that mode.

Useful? React with 👍 / 👎.

Comment on lines +72 to +73
export const CenterAligned: Story = {
render: (args) => ({
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Set center alignment args in CenterAligned popover story

CenterAligned also omits an align override, so it inherits 'left' from meta and does not render centered positioning. This makes the named variant inaccurate and reduces regression detection for center alignment behavior near constrained container widths.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ab4bee6c3c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines 32 to 33
"storybook:build": "storybook build -o storybook-static"
"test:visual": "playwright test --config playwright.visual.config.ts",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Add missing comma after storybook:build script entry

The scripts object is invalid JSON because "storybook:build" is not followed by a comma before "test:visual". With this syntax error, Node/npm cannot parse package.json, so any frontend npm command (npm install, npm run build, npm run storybook, etc.) fails immediately instead of running.

Useful? React with 👍 / 👎.

- package.json: Add missing comma after storybook:build and add storybook:docs script
- main.ts: Fix stripPwaPlugins to preserve nested array structure instead of flattening
- Stories: Add story-specific args to wire controls to render functions
  - TdPopover: Add position/align args for variant stories
  - TdDropdown: Add align arg for AlignRight story
  - TdDialog: Add title/description/closeOnBackdrop args for variant stories
@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@Chris0Jeky Chris0Jeky merged commit 53de768 into main Apr 12, 2026
24 of 25 checks passed
@Chris0Jeky Chris0Jeky deleted the feature/storybook-baseline branch April 12, 2026 01:05
@github-project-automation github-project-automation bot moved this from Pending to Done in Taskdeck Execution Apr 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

UI-12: Storybook baseline for UI primitives (optional premium-wave accelerator)

2 participants