Skip to content

feat(propel): add story generator, fix Storybook build, complete stories - #9518

Open
MartaCondeDesign wants to merge 7 commits into
makeplane:previewfrom
MartaCondeDesign:feat/propel-story-generator
Open

feat(propel): add story generator, fix Storybook build, complete stories#9518
MartaCondeDesign wants to merge 7 commits into
makeplane:previewfrom
MartaCondeDesign:feat/propel-story-generator

Conversation

@MartaCondeDesign

@MartaCondeDesign MartaCondeDesign commented Jul 31, 2026

Copy link
Copy Markdown

Closes #9519

Summary

  • Story generator script (scripts/generate-story.mjs): auto-generates complete .stories.tsx files by reading CVA variants and TypeScript props from helper.tsx. Produces per-variant named stories, AllVariants, AllSizes, and argTypes with select/boolean/text controls. Resolves type TXxx = "a" | "b" aliases for proper select options. Safe by default — won't overwrite existing stories without --force.
  • Audit script (scripts/audit.mjs): reports story coverage for all propel components (✅ complete / ⚠️ empty / ❌ missing).
  • Story coverage CI helper (scripts/check-story-coverage.sh): exits non-zero if coverage drops, suitable as a pre-merge gate.
  • Storybook Vite fix: @plane/constants workspace symlinks are not resolved by Vite at Storybook dev time. Inlined EIconSize (icons/state) and AXIS_LABEL_CLASSNAME (4 chart roots) directly. Also renamed tick callback propstickProps to fix no-shadow lint warnings.
  • Updated stories: badge, button, icon-button, input, ai-input, ai-command-palette, thinking-indicator — all with full CVA controls and AllVariants/AllSizes render stories.

Test plan

  • cd packages/propel && pnpm storybook — Storybook starts with no build errors
  • All 7 updated component stories render correctly (no "Element type is invalid" errors)
  • pnpm generate-story Button --force re-generates the button story without errors
  • pnpm generate-story NewComponent for a non-existent component prints a helpful error
  • Chart stories (BarChart, LineChart, AreaChart, ScatterChart) render axes correctly

Note: .github/workflows/ds-story-coverage.yml (PR coverage check) requires workflow OAuth scope and will be submitted in a follow-up PR.
Note: Unit tests for the generator and audit scripts are listed in the issue as pending work.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added AI command palette, AI input, AI textarea, streaming text, and thinking indicator components.
    • Added Storybook coverage for new AI and status-indicator experiences.
    • Added tooling to generate stories, audit component coverage, and verify story coverage.
  • Documentation
    • Improved Storybook controls, defaults, layouts, and variant demonstrations for buttons, badges, icon buttons, and inputs.
  • Refactor
    • Streamlined chart configuration and component story presentations without changing chart behavior.
  • Tests
    • Added automated browser testing for Storybook components and story coverage checks.

@CLAassistant

CLAassistant commented Jul 31, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Added Propel Storybook generation, auditing, and coverage scripts. Added AI-focused components and stories. Updated existing component stories and localized selected chart and icon constants.

Changes

Propel Storybook and component maintenance

Layer / File(s) Summary
Storybook audit, coverage, and browser testing
.gitignore, packages/propel/package.json, packages/propel/scripts/*, packages/propel/.storybook/main.ts, packages/propel/vitest.*
Added story generation commands, component audit reporting, story coverage checks, Storybook Vitest integration, and Playwright browser testing.
Component story generator
packages/propel/scripts/generate-story.mjs
Added parsing for component props, CVA variants, defaults, and children usage. The CLI generates Storybook metadata, controls, variant stories, and aggregate renderings.
AI component contracts and behavior
packages/propel/src/ai-command-palette/*, packages/propel/src/ai-input/*, packages/propel/src/ai-textarea/*, packages/propel/src/streaming-text/*, packages/propel/src/thinking-indicator/*
Added AI command palette, AI input, AI textarea, streaming text, and thinking indicator components with public types and module exports.
Component Storybook coverage
packages/propel/src/ai-command-palette/*.stories.tsx, packages/propel/src/ai-input/*.stories.tsx, packages/propel/src/badge/*.stories.tsx, packages/propel/src/button/*.stories.tsx, packages/propel/src/icon-button/*.stories.tsx, packages/propel/src/input/*.stories.tsx, packages/propel/src/thinking-indicator/*.stories.tsx
Added stories for new components and simplified existing Badge, Button, IconButton, and Input stories.
Local chart and icon constants
packages/propel/src/charts/*/root.tsx, packages/propel/src/icons/state/*
Defined chart axis-label constants and icon-size enums locally. Renamed tick callback parameters to tickProps while preserving prop forwarding.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Developer
  participant StoryGenerator
  participant PropelComponent
  participant Storybook
  Developer->>StoryGenerator: Run generate-story for a component
  StoryGenerator->>PropelComponent: Parse source and helper definitions
  PropelComponent-->>StoryGenerator: Return props, variants, defaults, and component name
  StoryGenerator->>Storybook: Write generated story file
  Storybook-->>Developer: Render controls and stories
Loading

Possibly related PRs

Suggested reviewers: prateekshourya29

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning New AICommandPalette, AIInput, AITextarea, StreamingText, and ThinkingIndicator implementations are unrelated to issue #9519's tooling and Storybook objectives. Move the new AI and streaming component implementations to a separate linked issue, or document an explicit requirement for them in this PR.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the story generator, Storybook fix, and completed story work.
Description check ✅ Passed The description explains the changes, test plan, deferred work, and linked issue, but omits the template's Type of Change checklist.
Linked Issues check ✅ Passed The PR adds the generator and audit tools, applies the Storybook fixes, and documents deferred workflow and unit tests for issue #9519.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (6)
packages/propel/scripts/audit.mjs (2)

134-139: 🎯 Functional Correctness | 🔵 Trivial

Substring matching can misclassify migration candidates.

uiWithoutPropel treats a packages/ui component as having a propel equivalent whenever either name is a substring of the other. This can produce false negatives, for example a ui component like input would match ai-input even though they are different components, hiding a real migration candidate from the report.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/propel/scripts/audit.mjs` around lines 134 - 139, Replace the
bidirectional substring matching in the uiWithoutPropel filter with an exact
component-name comparison, using the normalized lowercase names already
established by propelNames. Preserve candidates only when no exact Propel name
matches the UI component name.

56-65: 🚀 Performance & Scalability | 🔵 Trivial

Hardcoded-value regex doesn't filter what it intends to.

hardcodedValues first strips \d+px; from helperContent, then immediately tests the same (mostly unchanged) content again for /\d+px/. Since most pixel values inside Tailwind class strings or CVA config are not followed by a literal ;, this replace step removes almost nothing, so the extra step doesn't reduce false positives as intended.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/propel/scripts/audit.mjs` around lines 56 - 65, The hardcoded-value
detection in the hasHelper branch still matches pixel values after its
ineffective filtering step. Update the hardcodedValues expression to apply the
intended exclusion to the content actually tested, while preserving hex
detection and avoiding false positives from valid Tailwind/CVA pixel classes.
packages/propel/scripts/generate-story.mjs (3)

193-224: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicate component-file lookup logic.

findExportedComponent and componentUsesChildren both call readdirSync(dir) and run the identical .find(...) predicate to locate the component file. Extract a shared findComponentFile(dir) helper and reuse its result to avoid the duplicated file-system scan and predicate.

♻️ Proposed refactor
+function findComponentFile(dir) {
+  const files = readdirSync(dir);
+  return files.find(
+    (f) => f.endsWith(".tsx") && !f.includes(".stories.") && !f.includes("helper") && !f.includes("index")
+  );
+}
+
 function findExportedComponent(dir, fallback) {
-  const files = readdirSync(dir);
-  const componentFile = files.find(
-    (f) => f.endsWith(".tsx") && !f.includes(".stories.") && !f.includes("helper") && !f.includes("index")
-  );
+  const componentFile = findComponentFile(dir);
   if (!componentFile) return fallback;
   ...
 }

 function componentUsesChildren(dir) {
-  const files = readdirSync(dir);
-  const componentFile = files.find(
-    (f) => f.endsWith(".tsx") && !f.includes(".stories.") && !f.includes("helper") && !f.includes("index")
-  );
+  const componentFile = findComponentFile(dir);
   if (!componentFile) return false;
   ...
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/propel/scripts/generate-story.mjs` around lines 193 - 224, Extract
the repeated component-file discovery logic from findExportedComponent and
componentUsesChildren into a shared findComponentFile(dir) helper. Have both
functions reuse that helper’s result, preserving the existing fallback behavior
and children detection semantics.

339-357: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Use replaceAll for multi-hyphen variant labels.

opt.replace("-", " ") only replaces the first hyphen. Current variant names (e.g. error-fill) have a single hyphen so the bug is latent, but a future variant name with two or more hyphens produces a partially-transformed label such as "Error fill-outline". generatePerVariantStories (line 332) already handles this correctly by splitting on every hyphen.

 function generateAllVariantsRender(variantKey, options, componentName, hasChildren) {
   const items = options.map((opt) => {
-    const label = capitalizeFirst(opt.replace("-", " "));
+    const label = opt.split("-").map(capitalizeFirst).join(" ");
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/propel/scripts/generate-story.mjs` around lines 339 - 357, Update
the label construction in generateAllVariantsRender to replace every hyphen in
opt, matching the all-hyphen handling already used by generatePerVariantStories,
so multi-hyphen variant names produce fully transformed labels.

65-70: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Make stripStringLiterals preserve string length before reusing match indices.

stripStringLiterals replaces non-empty string values with "", '', or ``, so stripped is shorter than `variantsBlock`. This breaks the `stripped has same length` assumption when an earlier variant group contains non-empty class values and a later group value contains a literal `{`; the brace search can extract the wrong grouped options. Use a length-preserving placeholder or an offset table when reusing matched indices.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/propel/scripts/generate-story.mjs` around lines 65 - 70, Update
stripStringLiterals so every matched string literal is replaced with a
same-length placeholder, preserving stripped’s character offsets relative to
variantsBlock. Keep quote delimiters and escaped-content handling intact so
later brace searches using matched indices identify the correct variant groups.
packages/propel/scripts/check-story-coverage.sh (1)

27-42: 🚀 Performance & Scalability | 🔵 Trivial

"New directory" detection can flag pre-existing components.

new_dirs is derived from newly added files under packages/propel/src/. If this PR only adds a file to an already-existing component directory (for example, a new story file for an old component), that directory is treated as "new" and can fail the --new-only CI check even though the component itself isn't new. Consider deriving new directories by comparing the set of top-level directories that exist at base_sha versus HEAD, rather than from added file paths.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/propel/scripts/check-story-coverage.sh` around lines 27 - 42, The
new_dirs logic under NEW_ONLY incorrectly treats any newly added file as a new
component directory. Replace the added-file path derivation with a comparison of
top-level directories under packages/propel/src/ at base_sha and HEAD,
populating new_dirs only with directories absent from the base tree; retain the
existing sorting and deduplication behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/propel/scripts/check-story-coverage.sh`:
- Around line 71-79: Update the coverage calculation near total, covered, and
the “Coverage” output so an empty all_dirs array (total equal to zero) produces
a valid summary without arithmetic division by zero; retain the existing
percentage calculation when total is greater than zero.

In `@packages/propel/src/icons/state/helper.tsx`:
- Around line 7-13: Use the single EIconSize enum exported by
packages/propel/src/icons/state/helper.tsx for the entire icon API. In
packages/propel/src/icons/state/intake-state-group-icon.tsx lines 9-15 and
packages/propel/src/icons/state/state-group-icon.tsx lines 9-15, import
EIconSize from ./helper and remove each local duplicate declaration so their
defaults and size lookups use the shared type; no direct change is needed in
helper.tsx.

---

Nitpick comments:
In `@packages/propel/scripts/audit.mjs`:
- Around line 134-139: Replace the bidirectional substring matching in the
uiWithoutPropel filter with an exact component-name comparison, using the
normalized lowercase names already established by propelNames. Preserve
candidates only when no exact Propel name matches the UI component name.
- Around line 56-65: The hardcoded-value detection in the hasHelper branch still
matches pixel values after its ineffective filtering step. Update the
hardcodedValues expression to apply the intended exclusion to the content
actually tested, while preserving hex detection and avoiding false positives
from valid Tailwind/CVA pixel classes.

In `@packages/propel/scripts/check-story-coverage.sh`:
- Around line 27-42: The new_dirs logic under NEW_ONLY incorrectly treats any
newly added file as a new component directory. Replace the added-file path
derivation with a comparison of top-level directories under packages/propel/src/
at base_sha and HEAD, populating new_dirs only with directories absent from the
base tree; retain the existing sorting and deduplication behavior.

In `@packages/propel/scripts/generate-story.mjs`:
- Around line 193-224: Extract the repeated component-file discovery logic from
findExportedComponent and componentUsesChildren into a shared
findComponentFile(dir) helper. Have both functions reuse that helper’s result,
preserving the existing fallback behavior and children detection semantics.
- Around line 339-357: Update the label construction in
generateAllVariantsRender to replace every hyphen in opt, matching the
all-hyphen handling already used by generatePerVariantStories, so multi-hyphen
variant names produce fully transformed labels.
- Around line 65-70: Update stripStringLiterals so every matched string literal
is replaced with a same-length placeholder, preserving stripped’s character
offsets relative to variantsBlock. Keep quote delimiters and escaped-content
handling intact so later brace searches using matched indices identify the
correct variant groups.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 172623da-295f-48b7-8440-c069b2427159

📥 Commits

Reviewing files that changed from the base of the PR and between 3985693 and 09c2aaf.

📒 Files selected for processing (19)
  • .gitignore
  • packages/propel/package.json
  • packages/propel/scripts/audit.mjs
  • packages/propel/scripts/check-story-coverage.sh
  • packages/propel/scripts/generate-story.mjs
  • packages/propel/src/ai-command-palette/ai-command-palette.stories.tsx
  • packages/propel/src/ai-input/ai-input.stories.tsx
  • packages/propel/src/badge/badge.stories.tsx
  • packages/propel/src/button/button.stories.tsx
  • packages/propel/src/charts/area-chart/root.tsx
  • packages/propel/src/charts/bar-chart/root.tsx
  • packages/propel/src/charts/line-chart/root.tsx
  • packages/propel/src/charts/scatter-chart/root.tsx
  • packages/propel/src/icon-button/icon-button.stories.tsx
  • packages/propel/src/icons/state/helper.tsx
  • packages/propel/src/icons/state/intake-state-group-icon.tsx
  • packages/propel/src/icons/state/state-group-icon.tsx
  • packages/propel/src/input/input.stories.tsx
  • packages/propel/src/thinking-indicator/thinking-indicator.stories.tsx

Comment thread packages/propel/scripts/check-story-coverage.sh Outdated
Comment thread packages/propel/src/icons/state/helper.tsx Outdated
Story generator:
- add scripts/generate-story.mjs: auto-generates .stories.tsx from CVA
  variants and TypeScript props; creates per-variant stories, AllVariants,
  AllSizes, and argTypes controls; resolves type aliases for select options
- add scripts/audit.mjs: reports story coverage across all propel components
- add scripts/check-story-coverage.sh: CI helper, fails if coverage drops
- add generate-story npm script to packages/propel/package.json
- add .gitignore exception for packages/propel/scripts/

Storybook build fixes:
- inline EIconSize enum in icons/state (helper, state-group-icon,
  intake-state-group-icon) to remove @plane/constants dependency that
  Vite cannot resolve via workspace symlink at Storybook dev time
- inline AXIS_LABEL_CLASSNAME in all four chart root files for same reason
- rename tick callback props to tickProps in chart files (no-shadow lint)
- hardcode PlusIcon in IconButton showcase stories so the React.FC reference
  is not lost when Storybook serializes story state to the URL

Updated stories (badge, button, icon-button, input, ai-input,
ai-command-palette, thinking-indicator): full CVA controls, per-variant
named stories, AllVariants/AllSizes render stories.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@MartaCondeDesign
MartaCondeDesign force-pushed the feat/propel-story-generator branch from 09c2aaf to c31a65a Compare July 31, 2026 16:31
MartaCondeDesign and others added 2 commits July 31, 2026 20:40
- Export EIconSize from helper.tsx; import it in state-group-icon.tsx and
  intake-state-group-icon.tsx instead of each declaring a duplicate enum
- Guard check-story-coverage.sh against division by zero when total=0
- Fix new_dirs detection to only flag dirs with no files at base_sha
- Add audit-stories npm script to package.json
- Fix stripStringLiterals to preserve string length (index correctness)
- Fix opt.replace("-", " ") → split/map/join to handle multi-hyphen names
- Extract findComponentFile helper to remove duplicated logic
- Fix audit.mjs substring matching → exact match for migration candidates
- Fix hardcoded-value regex by removing ineffective .replace() filter step

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add source files for AI components referenced by existing stories:
ThinkingIndicator, AIInput, AITextarea, AICommandPalette, StreamingText.

Set up @storybook/addon-vitest with vitest + playwright so every story
runs as a render test. Add play() interaction tests to AI component
stories: ThinkingIndicator (status/aria-label), AIInput (typing, error
state, suggestion), AICommandPalette (search input, AI mode, loading).

Add test/test:ui npm scripts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (1)
packages/propel/src/streaming-text/streaming-text.tsx (1)

22-22: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use the Tailwind v4 overflow-wrap utility.

Replace break-words with wrap-break-word. This component relies on the utility to contain long streamed tokens.

Proposed fix
-    <span ref={ref} className={cn("break-words whitespace-pre-wrap", className)}>
+    <span ref={ref} className={cn("wrap-break-word whitespace-pre-wrap", className)}>

Based on learnings, Tailwind CSS v4 uses wrap-break-word for overflow-wrap utilities.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/propel/src/streaming-text/streaming-text.tsx` at line 22, Update the
class list on the span rendered by the StreamingText component to replace the
Tailwind v3 `break-words` utility with Tailwind v4’s `wrap-break-word`,
preserving the existing whitespace, custom class, and ref behavior.

Source: Learnings

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/propel/package.json`:
- Line 66: Update the package manifest’s test:ui dependency setup so `@vitest/ui`
is explicitly declared using the workspace catalog: protocol when no existing
workspace manifest already provides it, ensuring vitest --ui runs without
first-run installation.

In `@packages/propel/src/ai-command-palette/ai-command-palette.tsx`:
- Around line 49-79: Update AICommandPalette to honor the declared open prop by
rendering the palette only when open is true, while preserving the existing
default behavior when open is unspecified. Extend the component’s keyboard
handling to detect Escape and call onOpenChange(false), including the input path
associated with the “Esc close” hint.

In `@packages/propel/src/ai-textarea/ai-textarea.tsx`:
- Around line 41-45: Update the command option interaction in the rendered
command option element so onMouseDown only prevents focus loss, while onClick
invokes onSelect(cmd). Preserve pointer behavior and ensure keyboard-generated
clicks select the focused command.
- Around line 106-118: Update handleSelectCommand to validate that the current
line still begins with the slash-command prefix before removing it, returning
without changes when the caret has moved elsewhere. After computing the
replacement value, update the textarea DOM value so uncontrolled defaultValue
usage removes the command visibly, while preserving the existing onChange,
onCommand, and menu-closing behavior for valid selections. Add tests covering
caret movement and uncontrolled defaultValue usage.

---

Nitpick comments:
In `@packages/propel/src/streaming-text/streaming-text.tsx`:
- Line 22: Update the class list on the span rendered by the StreamingText
component to replace the Tailwind v3 `break-words` utility with Tailwind v4’s
`wrap-break-word`, preserving the existing whitespace, custom class, and ref
behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 0614a660-36ce-49f9-a56d-d4b47361376a

📥 Commits

Reviewing files that changed from the base of the PR and between 6f20a9a and 043de9a.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (21)
  • packages/propel/.storybook/main.ts
  • packages/propel/package.json
  • packages/propel/src/ai-command-palette/ai-command-palette.stories.tsx
  • packages/propel/src/ai-command-palette/ai-command-palette.tsx
  • packages/propel/src/ai-command-palette/helper.tsx
  • packages/propel/src/ai-command-palette/index.ts
  • packages/propel/src/ai-input/ai-input.stories.tsx
  • packages/propel/src/ai-input/ai-input.tsx
  • packages/propel/src/ai-input/helper.tsx
  • packages/propel/src/ai-input/index.ts
  • packages/propel/src/ai-textarea/ai-textarea.tsx
  • packages/propel/src/ai-textarea/helper.tsx
  • packages/propel/src/ai-textarea/index.ts
  • packages/propel/src/streaming-text/index.ts
  • packages/propel/src/streaming-text/streaming-text.tsx
  • packages/propel/src/thinking-indicator/helper.tsx
  • packages/propel/src/thinking-indicator/index.ts
  • packages/propel/src/thinking-indicator/thinking-indicator.stories.tsx
  • packages/propel/src/thinking-indicator/thinking-indicator.tsx
  • packages/propel/vitest.config.ts
  • packages/propel/vitest.shims.d.ts

Comment thread packages/propel/package.json
Comment thread packages/propel/src/ai-command-palette/ai-command-palette.tsx
Comment thread packages/propel/src/ai-textarea/ai-textarea.tsx
Comment thread packages/propel/src/ai-textarea/ai-textarea.tsx
MartaCondeDesign and others added 4 commits August 1, 2026 08:42
- AICommandPalette: honor open prop (renders null when false); call
  onOpenChange(false) on Escape in both search and AI input paths
- AITextarea: split onMouseDown/onClick on command buttons so keyboard
  activation works; validate current line starts with "/" before
  removing slash-command text; update textarea DOM for uncontrolled usage
- StreamingText: replace Tailwind v3 break-words with v4 wrap-break-word
- package.json: declare @vitest/ui 4.1.8 so test:ui does not rely on
  first-run install fallback

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Runs on every PR targeting preview that touches packages/propel/src/.
Two steps:
- Print full coverage summary (informational, never fails)
- Fail if any NEW component directory added in the PR is missing a
  .stories.tsx file (--new-only mode, uses GITHUB_BASE_SHA)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The job now computes coverage at base and HEAD, posts a table with the
before/after percentages as a PR comment (updates the existing comment
on re-runs), and includes a collapsible full report. The --new-only step
still fails the check if a new component dir has no .stories.tsx.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… to Button

Expose both icon props via Storybook select controls with icon mapping so
they work interactively on every variant story. Add WithPrependIcon,
WithAppendIcon and WithBothIcons gallery stories covering all 8 variants.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🛠️ Improvement: Add story generator script and fix Storybook standalone build for propel

2 participants