Repository navigation
Conversation
Co-locate Rotation, ExpandInCollapseOut, and FadeInSlideOut stories into packages/gamut/src/Animation (behavior + a11y via play), and remove the old styleguide Animations folder. Also drop the now-empty Atoms About/AboutToC. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-locate Button atoms (ButtonExamples, CTAButton, FillButton, IconButton, StrokeButton, TextButton) as stories under Actions/Buttons, folding the old IconButton/TextButton node tests into play assertions. Add a variant argType + full variant/size matrix (with a labeled column) to the examples grid, and a storySort pinning Button Examples first in the folder. Remove the old styleguide Buttons folder and the Button __tests__. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-locate Badge, ProgressBar, RadialProgress, Shimmer, Spinner, and FeatureShimmer as stories under the Status category, with behavior/a11y assertions in play functions. Keep node tests only where a browser play can't reach: ProgressBar's useLogicalProperties width matrix and FeatureShimmer's reduced-motion hook mock (both co-located). Remove the old styleguide folders (Badge, ProgressBar, RadialProgress, FeatureShimmer, Loaders) and the Button-style __tests__ dirs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-locate the story under Navigation and move the href check into a play function. Remove the Jest test and the old styleguide story. Co-Authored-By: Grok 4.7 <noreply@x.ai> Co-authored-by: Cursor <cursoragent@cursor.com>
Co-locate both under Utilities, fold their Jest coverage into play functions, and remove the old styleguide stories and node tests. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-locate both under Containers. Fold the Card render tests and the Drawer expand/collapse tests into play functions, keep only the node-only useCardElevation logic, and add variant/shadow/borderRadius argTypes to Card. Remove the old styleguide stories. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-locate both under Actions and fold their Jest coverage into play functions (roles, callbacks, disabled states, aria-label), then remove the node tests and old styleguide stories. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-locate the story under Overlays and move the node tests out of __tests__ (PopoverContainer.test.tsx, hooks.test.tsx, testUtils.ts), excluding the test helper from the lib build. Disable FocusTrap autofocus in the catalog stories so the docs page no longer hijacks scroll, and remove the old styleguide story. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Move the useCardElevation test to Card/Card.test.tsx to match the co-located convention used by the other migrated components. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-locate all Form stories under Inputs & forms (inputs un-nested, form elements in a Form subfolder). Fold the input node tests (Input, Select, Checkbox, Radio, RadioGroup, FormGroup) into play functions and relocate the SelectDropdown suites, utils, and hook out of __tests__ as node Jest. Add a core open-and-select play for SelectDropdown. Remove the old styleguide FormElements and FormInputs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Move Checkbox, Radio, and SelectDropdown into their own folders under Form/inputs, each with an index and co-located styles - Replace the Form/styles barrel with Form/styles.ts - Migrate SelectDropdown jest tests (default, empty, grouped) to story play functions and remove the now-unused Form/__fixtures__ - Leave stories failing with TODOs where plays expose real component bugs: Remove all button aria-hidden-focus, empty menu listbox aria-required-children, and duplicate ids breaking inputProps.combobox Co-authored-by: Cursor <cursoragent@cursor.com>
Tighten Form story assertions, rename Error stories to ErrorState, and add coverage for SelectDropdown inputProps and validation message precedence. Convert multi-line TODO comments to block comments. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Drop inherited aria-hidden from RemoveAllButton, disable aria-required-children on empty-menu stories, and use distinct id/name in Custom Input Props. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Separate ValueWithoutOptions into empty and undefined options stories, and keep the component JSDoc off the Storybook docs page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-locate all three under Feedback and fold their Jest coverage into play functions (close/CTA callbacks, truncation, close button props, icon layout, toast stacking). Keep the Alert close button ref test as co-located Jest and remove the old styleguide stories. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-locate both under Navigation and fold their Jest coverage into play functions (links vs text crumbs, payload clicks, page/arrow/jump buttons, ellipsis hover, controlled page number). Remove the node tests and old styleguide stories. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add className to the docgen propFilter and drop the per-story argTypes overrides in PopoverContainer and SkipToContent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-locate the story under Containers and fold the Jest coverage into play functions (expand/collapse, initiallyExpanded, CTA callback). Coerce initiallyExpanded to a boolean so the button always sets aria-expanded, and remove the node test and old styleguide story. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add Column as a LayoutGrid subcomponent and drop the stale SB 8 cast on Toaster's Toast subcomponent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-locate Menu and MenuItem as sibling pages under Actions/Menu and fold the Jest coverage into play functions. Keep the MenuItem ref tests as co-located Jest. Disable the a11y rules the nested menu stories break, with TODOs, and remove the old styleguide story. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Move each component out of its own folder to a sibling file named after it, and update the relative imports. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-locate Coachmark under Feedback and Flyout under Overlays, folding their Jest coverage into play functions (show/hide, delay, close button, Escape, inside and outside clicks). Share one render per meta and remove the node tests and old styleguide stories. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-locate all three under Overlays and fold their Jest coverage into play functions, including Popover positioning, viewport, and RTL checks against real layout. Keep Modal ref tests and Popover pure-function tests as co-located Jest, and remove the old styleguide stories. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Put play helpers, example components, and shared data after the meta in the migrated stories, keeping above it only what the meta uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-locate InfoTip, PreviewTip, and ToolTip under Feedback/Tips and fold their Jest coverage into play functions, adding plays for focus, hover, closeOnClick, loading, and RTL. Rename src/Tip to src/Tips, keep the pure shared util tests as co-located Jest, and remove the old stories. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-locate Tabs under Navigation and fold the Jest coverage into play functions, adding keyboard, focus, and disabled-click checks. Remove the node tests and the now-empty styleguide Molecules folder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
src/Tip was renamed to src/Tips, so manifest.test.ts couldn't resolve the historical Tip/shared/types import. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Moved to ajr-props-table-fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ports DatePicker component tests to play functions under Inputs & forms/DatePicker, adds coverage for outside click, range edge cases and single-month layout, and colocates the remaining unit tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ports ConnectedForm, SubmitButton, useField, useDebouncedField and nested checkbox tests to play functions under Inputs & forms/ConnectedForm, and adds coverage for error wiring, hideLabel, wasSubmitSuccessful and validating state. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Set parameters.docs.propsTable: false to leave out the props table when several story files document one component. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ports GridForm tests to play functions under Inputs & forms/GridForm, keeping the topic groups and adding Validation and NestedCheckboxes groups. Known bugs are left as TODOs in the plays. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ConnectedForm Default now takes args so its props table has controls, and shows its static source since the dynamic snippet crashes. GridForm validation gets a radio control. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Stories now live under Data display/BarChart, with plays covering the old tests plus layout, clamping, sort and keyboard flows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Stories now live under Data display/Markdown, with plays covering the old tests plus sanitization, skipped overrides, video and override APIs. Adds vite/client typings so ?raw imports type-check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@skillsoft/eslint-plugin-gamut
@skillsoft/gamut
@skillsoft/gamut-agent-tools
@skillsoft/gamut-codemods
@skillsoft/gamut-icons
@skillsoft/gamut-illustrations
@skillsoft/gamut-patterns
@skillsoft/gamut-styles
@skillsoft/gamut-tests
@skillsoft/variance
commit: |
|
List, ListRow, ListCol and TableHeader stories now live under Data display/List, with plays covering the old tests plus scrolling, responsive layout, sortable headers and expandable rows. Known bugs are marked with TODOs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nothing imports it and List doesn't export it; it duplicated an older ListCol. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DataList and DataTable stories now live under Data display, with plays covering the old DataGrid tests plus sorting, filtering, selection, expansion, row actions and scrolling. Known bugs are marked with TODOs. Removes the now-empty Organisms styleguide folder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The render ignored args, so its controls showed "Setup controls". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Shows query.sort.* as separate controls, as before #57 made deep controls opt-in. Radio controls for spacing and variant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…killsoft-gamut into ajr-migrate-organisms
Moves Video into Media & Assets with plays covering the old Jest tests and new user flows. Vidstack YouTube stories that throw on unmount are tagged !test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Uses real media URLs, waits for players to load, and tags vidstack YouTube stories that throw on unmount as !test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LinKCoding
reviewed
Nov 11, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Overview
This PR moves the Organisms components, plus Video, out of the styleguide package and into colocated Storybook stories in
packages/gamut. Their Jest component tests become storyplayfunctions, which run in a real browser through addon-vitest. It follows the same approach as the atoms, molecules and forms migration PRs.The motivation is the same as the earlier rounds. jsdom can't check real layout, scrolling, container queries, focus, media playback or axe results, and several of the old tests passed without asserting anything that could fail. Plays run against rendered stories, so every documented example is now also a test.
Components migrated
Inputs & forms/DatePickerDatePicker,DatePickerInput,DatePickerInputSegment,DatePickerCalendar,CalendarHeader/Nav/Footerand most ofCalendarBodyInputs & forms/ConnectedForm/*ConnectedForm,SubmitButton,useField,useDebouncedField,ConnectedNestedCheckboxesInputs & forms/GridForm/*GridForm,GridFormInputGroup,GridFormInputs,GridFormSection(Title),GridFormContent,GridFormNestedCheckboxInputData display/BarChartBarChartData display/MarkdownMarkdown,Details,MarkdownAnchorData display/List/*ListData display/DataList,Data display/DataTableDataGridMedia & Assets/VideoVideoHow it works
it()in a deleted test file to the story whose play covers it. Pure style assertions (colors, spacing, class names) are the only things dropped.hideLabel,wasSubmitSuccessful, validating state.scrollToTopOnUpdate,rowBreakpoint, sortable and sticky headers, expandable table rows, clickable rows in ordered lists, horizontal scrolling inside a container.aria-sortcycle, local sorting and filtering, and reset filters.hideSelectAll, multiple expanded rows, the card variant, and loading without rows.onReadyandonPlay, play and pause, seeking back 10 seconds, and thek/mkeyboard shortcuts.muted: true, because a synthetic click doesn't count as a user gesture for unmuted playback.example.commedia URLs, which the browser blocks (ORB/CORS). They now use the same real media, and they wait for vidstack'sdata-can-playbefore asserting.__tests__/. These include the BarChart, DatePicker and Segment utils, part ofCalendarBody,DatePickerContextandMarkdownVideo..mdxpages are replaced by autodocs with story descriptions. This removes the wholepackages/styleguide/src/lib/Organisms/andpackages/styleguide/src/lib/Apps/folders. Video's docs description keeps the import path and the peer-dependency install note.examples.tsxtoDataList/testUtils.tsx.tsconfig.lib.jsonalready excludes that file from the build. The move also fixes an invalidsize: 'xs'column, a stray sparse array entry and a "Disipline" typo in the demo menu.Supporting changes
DocsPage: a meta can setparameters.docs.propsTable: falseto leave out the props table. Several story files document one component (ConnectedForm, GridForm, List), and only one of them should show the props table.spacing(andvarianton DataList). GridForm, DatePicker, BarChart and Markdown need the same treatment, which I'll do in a follow-up.PlainStylednow passes its args through, so its controls work.tsconfig.storybook.jsonaddsvite/clienttypings so the Markdown story's?rawimport ofexample.mdtype-checks.List/Header/ListHeaderCol.tsxis removed (separate commit). Nothing imports it, List doesn't export it, and it duplicated an olderListCol.Known component bugs
This PR doesn't fix any component behavior; only stories and tests change. Where a play found a real bug, I removed the failing assertion and left a
// TODO:at the top of the play. Where the bug is an axe violation, the story disables only that rule throughparameters.a11y.config.rules. Each one has a ticket in the epic:theadinside thetbody. Theheaderprop works correctly.scrollable-region-focusableis disabled on the affected stories.scrollToTopOnUpdatescrolls the wrong element (List, DataTable and DataList).ul/ollists.rowBreakpointsm/mdalso respond to viewport width, not just container width.type="header"are exposed as column headers instead of row headers (List, DataTable and DataList).useLocalQuery: clearing a sort leaves rows in ascending order instead of the original order.useLocalQuery: only one sort and one filter apply at a time, so filtering a second column clears the first.wrapperWidthdoesn't constrain DataTable.landmark-uniqueis disabled onMultipleExpanded.codeoverride resets code's allowed attributes, so CodeBlock loseslanguage.detailsentry, soopenis stripped.MarkdownVideoturns a non-numericwidth/heightsuch as100%intoNaN.frame-titleis disabled on VideoVimeoWithoutTitleand MarkdownVimeoOverride.provider destroyedandAbortErrorrejections. Part of the cause is Gamut's YouTube workaround inVidstackPlayer, and part is vidstack's own teardown. Vitest fails the whole run on unhandled rejections, so these stories are tagged!test. They still render in Storybook and Docs, and their plays pass when run on their own:YoutubeWithCaptions,YoutubeWithoutPlayerEmbedWithoutPlayerEmbed,YoutubeVideoWithCaptions@vidstack/react/types/vidstacktype imports don't resolve under bundler resolution, sotsc -p packages/gamut/tsconfig.storybook.jsonreports TS2307 in three Video files. The error predates this PR and has no runtime effect.scrollable-region-focusableis disabled onCaptionsMenu.Validation.stories.tsx).Known limitations
organisms-*todata-display-*/inputs-forms-*, and fromapps-video-*tomedia-assets-video-*. The gamut-docs embeds still point at the old ids. I kept the existing story names so the old ids map one-to-one when the docs site is updated.onReady, so no play depends on either.aria-hidden-focuswhile it's open. Focus stays trapped in the menu, so it's a false positive, and the stories close the popover with Escape before the axe pass runs.WithFloatingMenuallows a 1px tolerance, because the column shifts by 1px after scrolling in Chromium.Notes for reviewers
DocsPage.tsx,tsconfig.storybook.jsonand the deletion ofListHeaderCol.tsx.ListHeaderColremoval is separate. Video's migration and the Markdown video fixes are the last two commits.DataListandDataTablestories use instantiation-expression type aliases, for exampletype CrewDataTable = typeof DataTable<CrewRow, 'name', ColumnConfig<CrewRow>[]>. Without them,Meta/StoryObjinferRowasunknown.waitFor, because vidstack animates the menus in and tooltips only become accessible after hover.PR Checklist
Testing Instructions
yarn test:storiesfrom the repo root and confirm every story passes, including the axe checks, with no unhandled errors reported.yarn testand confirm the remaining colocated Jest tests pass (BarChart, DatePicker and Markdown utils,CalendarBody,DatePickerContext,MarkdownVideo).Data display/DataTable→WithFloatingMenu,LocalSorting,LocalFilteringData display/DataList→FullDataListInputs & forms/DatePicker,Inputs & forms/GridForm/Validation,Data display/BarChartMedia & Assets/Video→PlayAndPause,KeyboardShortcuts,CaptionsMenu,YoutubeWithPlaceholder!teststories (Media & Assets/Video→YoutubeWithCaptions,YoutubeWithoutPlayerEmbed, andData display/Markdown→WithoutPlayerEmbed,YoutubeVideoWithCaptions). Confirm each one renders and its play passes in the Interactions panel.OrganismsorAppssection, and that each migrated component appears underData display,Inputs & formsorMedia & Assets.Inputs & forms/ConnectedForm/ConnectedForm,Data display/List/ListandMedia & Assets/Video. Confirm the props table appears once with working controls, and check each in dark mode.Data display/DataListandData display/DataTable, confirmspacing(andvarianton DataList) is a radio control.Data display/List/ListRow→ExpandableButtonandData display/DataList→FullDataList, use only the keyboard to expand, collapse and select rows, then repeat with VoiceOver.Media & Assets/Video→Default, use only the keyboard to play, pause, seek and open the settings menu, then repeat with VoiceOver.🤖 Generated with Claude Code