Skip to content

feat(base-ui): desktop-native consistency sweep#34

Open
joshuapare wants to merge 16 commits into
mainfrom
feat/consistency-2
Open

feat(base-ui): desktop-native consistency sweep#34
joshuapare wants to merge 16 commits into
mainfrom
feat/consistency-2

Conversation

@joshuapare
Copy link
Copy Markdown
Contributor

Summary

Complete consistency sweep of @omniview/base-ui to prepare for omniview application migration.

  • 5-tier desktop-native size scale (xs=18px, sm=22px, md=26px, lg=32px, xl=40px) — grounded in VS Code and JetBrains measurements
  • 8 semantic colors — added discovery (purple) and secondary (cyan) across all 7 theme variants, plus fixed missing info color CSS in 30 components
  • Complete variant coverage — all interactive components support solid/soft/outline/ghost where applicable; filled gaps in Select, Autocomplete, Combobox, MultiSelect (soft), AlertDialog, Menu, ContextMenu (solid/variants)
  • IconButton fix — removed dense prop, fixed rectangular bug (was wider than tall due to Button min-width cascade)
  • Tabs overhaul — added startDecorator prop, fixed active state (was using wrong data attribute), flat variant now has raised bg + colored indicator like browser tabs
  • Tooltip.Trigger fix — was a full styled button (76 lines of button CSS), now a transparent pass-through
  • Toolbar aligned to tokens — uses control-height tokens instead of hardcoded rem values
  • Bug fixes — Pagination token misalignment, TextArea/TextField lg font-size, Checkbox/Radio lg label hardcode, missing --ov-space-stack-xs token
  • Consistency check story — visual audit tool at Consistency/Size & Color Audit with size grid, color×variant matrix, and IconButton squareness check
  • All story argTypes updated — xs/xl sizes and discovery/secondary colors in all 65+ story files
  • All 7 themes added to Storybook toolbar (was missing obsidian, carbon, void)

199 files changed, 4213 insertions, 507 deletions. 1008 tests passing.

Breaking Changes

All control heights decreased significantly (this is intentional — done before any consumers migrate):

Size Old Height New Height
sm 28px 22px
md 36px 26px
lg 42-44px 32px

IconButton.dense prop removed — use size="xs" instead.

Test plan

  • Full test suite passes (1008 tests)
  • Visual check: run pnpm storybook → Consistency/Size & Color Audit story
  • Visual check: verify all 7 themes render correctly in the audit story
  • Visual check: run showcase (pnpm --filter @omniview/base-ui build && pnpm --filter @omniview/editors build && pnpm --filter @omniview/ai-ui build && pnpm showcase)
  • Verify IconButton is square at all sizes
  • Verify Tab active state is visible in flat variant

Known follow-ups (not in scope)

  • ai-ui artifact panel: border radius nesting, should fill sidebar edge-to-edge
  • CodeBlock copy button: could use IconButton instead of custom button
  • Compact density mode: token architecture supports it, not yet implemented

… values

Add xs/xl to size scale and discovery/secondary to color palette.
Shift all component sizing tokens to desktop-native scale
(18/22/26/32/40px) and add discovery (purple) + secondary (cyan)
color tokens across all 7 theme variants.
Also: IconButton removes dense prop, fixes rectangular bug with
physical min-width override, adds xs/xl size support.
…dary colors

Also fixes TextArea and TextField lg font-size not being set.
…y colors

Also fixes Checkbox/Radio lg label font-size hardcode.
Updates Chip, DataTable, Table, ActionList, Pagination, Tabs,
EditorTabs, Banner, Badge, Progress, Spinner, StatusDot, Meter,
Skeleton. Also fixes Pagination token misalignment bugs.
…nsistency

Updates Card, Sheet, Popover, AlertDialog, Menu, ContextMenu, Tooltip,
Toast, Avatar, Separator, ScrollArea, Slider, Toolbar, SegmentedControl,
SplitButton, ToggleButton, TagInput, NumberInput, StatRow, StatusBar,
Timeline, TreeList, CodeBlock, List, Skeleton, StatusDot.
Adds missing variant CSS for AlertDialog, Menu, ContextMenu.
Expands SplitButtonColor type.
Add visual audit story (Consistency/Size & Color Audit) with:
- Size consistency grid showing all controls at xs/sm/md/lg/xl
- Color x Variant matrix on dark and light surfaces
- IconButton squareness check

Also updates all story argTypes to include xs/xl sizes and
discovery/secondary colors.
The info color existed in the type system but had no CSS rules in most
interactive components. Now all components that support colors have
complete info/discovery/secondary coverage.
- Fix SIZE_HEIGHTS labels (md=26, lg=32, xl=40)
- Render Checkbox/Radio as control-only (no label) for fair height comparison
- Add obsidian, carbon, void themes to Storybook toolbar switcher
Tab triggers with icon + text children had no gap between them.
Adds gap: var(--ov-space-stack-xs) and sizes SVG icons to 1em.
- Add startDecorator prop to Tabs.Tab (matching Button pattern)
- Use --_ov-tab-icon-size variable for decorator sizing per size tier
- Fix inactive tab color: use fg-subtle instead of fg-muted
- Remove SVG-specific fallback rules in favor of decorator wrapper
- Update showcase to use startDecorator API
- Remove stale dense props from showcase IconButtons
- Fix Tabs: use data-active (not data-selected) for Base UI compat
- Flat variant active tab: raised bg + colored inset top shadow
- EditorTabs active tab: use bg-surface-raised for better contrast
- Toolbar: use control-height tokens instead of hardcoded rem
- Toolbar Group: use --ov-space-stack-xs token
- Showcase browser: use Toolbar component with proper Groups
…button

The Trigger had full button styling (height, padding, background, border)
which caused any element wrapped in a Tooltip to render with extra sizing.
Now it's just display: inline-flex — visual styling comes from the
child element (IconButton, Button, etc.).
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 18, 2026

Important

Review skipped

Too many files!

This PR contains 199 files, which is 49 over the limit of 150.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 9ff7305c-0fdf-4c33-9e92-68324ef262fc

📥 Commits

Reviewing files that changed from the base of the PR and between e5e7f6a and e94cb4d.

📒 Files selected for processing (199)
  • apps/showcase/src/demos/container-management/components/ContainerDetail.tsx
  • apps/showcase/src/demos/web-browser/components/BrowserToolbar.tsx
  • apps/showcase/src/demos/web-browser/index.module.css
  • packages/base-ui/.storybook/preview.tsx
  • packages/base-ui/src/components/_consistency/ConsistencyCheck.stories.tsx
  • packages/base-ui/src/components/accordion/Accordion.stories.tsx
  • packages/base-ui/src/components/action-list/ActionList.module.css
  • packages/base-ui/src/components/action-list/ActionList.stories.tsx
  • packages/base-ui/src/components/action-list/ActionList.test.tsx
  • packages/base-ui/src/components/alert-dialog/AlertDialog.module.css
  • packages/base-ui/src/components/alert-dialog/AlertDialog.stories.tsx
  • packages/base-ui/src/components/alert-dialog/AlertDialog.test.tsx
  • packages/base-ui/src/components/autocomplete/Autocomplete.module.css
  • packages/base-ui/src/components/autocomplete/Autocomplete.stories.tsx
  • packages/base-ui/src/components/autocomplete/Autocomplete.test.tsx
  • packages/base-ui/src/components/avatar-group/AvatarGroup.stories.tsx
  • packages/base-ui/src/components/avatar/Avatar.module.css
  • packages/base-ui/src/components/avatar/Avatar.stories.tsx
  • packages/base-ui/src/components/avatar/Avatar.test.tsx
  • packages/base-ui/src/components/badge/Badge.module.css
  • packages/base-ui/src/components/badge/Badge.stories.tsx
  • packages/base-ui/src/components/badge/Badge.test.tsx
  • packages/base-ui/src/components/badge/Badge.tsx
  • packages/base-ui/src/components/banner/Banner.module.css
  • packages/base-ui/src/components/banner/Banner.stories.tsx
  • packages/base-ui/src/components/banner/Banner.test.tsx
  • packages/base-ui/src/components/basic-list/BasicList.stories.tsx
  • packages/base-ui/src/components/breadcrumbs/Breadcrumbs.stories.tsx
  • packages/base-ui/src/components/button-group/ButtonGroup.stories.tsx
  • packages/base-ui/src/components/button/Button.module.css
  • packages/base-ui/src/components/button/Button.stories.tsx
  • packages/base-ui/src/components/button/Button.test.tsx
  • packages/base-ui/src/components/card/Card.module.css
  • packages/base-ui/src/components/card/Card.stories.tsx
  • packages/base-ui/src/components/card/Card.test.tsx
  • packages/base-ui/src/components/checkbox-group/CheckboxGroup.stories.tsx
  • packages/base-ui/src/components/checkbox/Checkbox.module.css
  • packages/base-ui/src/components/checkbox/Checkbox.stories.tsx
  • packages/base-ui/src/components/checkbox/Checkbox.test.tsx
  • packages/base-ui/src/components/chip/Chip.module.css
  • packages/base-ui/src/components/chip/Chip.stories.tsx
  • packages/base-ui/src/components/chip/Chip.test.tsx
  • packages/base-ui/src/components/code-block/CodeBlock.module.css
  • packages/base-ui/src/components/code-block/CodeBlock.stories.tsx
  • packages/base-ui/src/components/code-block/CodeBlock.test.tsx
  • packages/base-ui/src/components/combobox/Combobox.module.css
  • packages/base-ui/src/components/combobox/Combobox.stories.tsx
  • packages/base-ui/src/components/combobox/Combobox.test.tsx
  • packages/base-ui/src/components/confirm-button/ConfirmButton.stories.tsx
  • packages/base-ui/src/components/context-menu/ContextMenu.module.css
  • packages/base-ui/src/components/context-menu/ContextMenu.stories.tsx
  • packages/base-ui/src/components/context-menu/ContextMenu.test.tsx
  • packages/base-ui/src/components/data-table/DataTable.Nested.stories.tsx
  • packages/base-ui/src/components/data-table/DataTable.Pinning.stories.tsx
  • packages/base-ui/src/components/data-table/DataTable.Selection.stories.tsx
  • packages/base-ui/src/components/data-table/DataTable.Virtualized.stories.tsx
  • packages/base-ui/src/components/data-table/DataTable.module.css
  • packages/base-ui/src/components/data-table/DataTable.stories.tsx
  • packages/base-ui/src/components/data-table/DataTable.test.tsx
  • packages/base-ui/src/components/data-table/DataTableColumnVisibility.tsx
  • packages/base-ui/src/components/data-table/DataTablePagination.tsx
  • packages/base-ui/src/components/description-list/DescriptionList.stories.tsx
  • packages/base-ui/src/components/editor-tabs/EditorTabs.module.css
  • packages/base-ui/src/components/editor-tabs/EditorTabs.stories.tsx
  • packages/base-ui/src/components/editor-tabs/EditorTabs.test.tsx
  • packages/base-ui/src/components/empty-state/EmptyState.stories.tsx
  • packages/base-ui/src/components/filter-bar/FilterBar.stories.tsx
  • packages/base-ui/src/components/filter-bar/FilterBar.tsx
  • packages/base-ui/src/components/find-bar/FindBar.tsx
  • packages/base-ui/src/components/form-field/FormField.stories.tsx
  • packages/base-ui/src/components/icon-button/IconButton.module.css
  • packages/base-ui/src/components/icon-button/IconButton.stories.tsx
  • packages/base-ui/src/components/icon-button/IconButton.test.tsx
  • packages/base-ui/src/components/icon-button/IconButton.tsx
  • packages/base-ui/src/components/input/Input.module.css
  • packages/base-ui/src/components/input/Input.stories.tsx
  • packages/base-ui/src/components/input/Input.test.tsx
  • packages/base-ui/src/components/list/List.module.css
  • packages/base-ui/src/components/list/List.stories.tsx
  • packages/base-ui/src/components/list/List.test.tsx
  • packages/base-ui/src/components/menu/Menu.module.css
  • packages/base-ui/src/components/menu/Menu.stories.tsx
  • packages/base-ui/src/components/menu/Menu.test.tsx
  • packages/base-ui/src/components/meter/Meter.module.css
  • packages/base-ui/src/components/meter/Meter.stories.tsx
  • packages/base-ui/src/components/meter/Meter.test.tsx
  • packages/base-ui/src/components/multi-select/MultiSelect.module.css
  • packages/base-ui/src/components/multi-select/MultiSelect.stories.tsx
  • packages/base-ui/src/components/multi-select/MultiSelect.test.tsx
  • packages/base-ui/src/components/multi-select/MultiSelect.tsx
  • packages/base-ui/src/components/nav-list/NavList.stories.tsx
  • packages/base-ui/src/components/number-input/NumberInput.module.css
  • packages/base-ui/src/components/number-input/NumberInput.stories.tsx
  • packages/base-ui/src/components/number-input/NumberInput.test.tsx
  • packages/base-ui/src/components/pagination/Pagination.module.css
  • packages/base-ui/src/components/pagination/Pagination.stories.tsx
  • packages/base-ui/src/components/pagination/Pagination.test.tsx
  • packages/base-ui/src/components/popover/Popover.module.css
  • packages/base-ui/src/components/popover/Popover.stories.tsx
  • packages/base-ui/src/components/popover/Popover.test.tsx
  • packages/base-ui/src/components/progress/Progress.module.css
  • packages/base-ui/src/components/progress/Progress.stories.tsx
  • packages/base-ui/src/components/progress/Progress.test.tsx
  • packages/base-ui/src/components/radio-group/RadioGroup.stories.tsx
  • packages/base-ui/src/components/radio/Radio.module.css
  • packages/base-ui/src/components/radio/Radio.stories.tsx
  • packages/base-ui/src/components/radio/Radio.test.tsx
  • packages/base-ui/src/components/row-list/RowList.stories.tsx
  • packages/base-ui/src/components/scroll-area/ScrollArea.module.css
  • packages/base-ui/src/components/scroll-area/ScrollArea.stories.tsx
  • packages/base-ui/src/components/scroll-area/ScrollArea.test.tsx
  • packages/base-ui/src/components/search-input/SearchInput.stories.tsx
  • packages/base-ui/src/components/search-input/SearchInput.tsx
  • packages/base-ui/src/components/segmented-control/SegmentedControl.module.css
  • packages/base-ui/src/components/segmented-control/SegmentedControl.stories.tsx
  • packages/base-ui/src/components/segmented-control/SegmentedControl.test.tsx
  • packages/base-ui/src/components/select/Select.module.css
  • packages/base-ui/src/components/select/Select.stories.tsx
  • packages/base-ui/src/components/select/Select.test.tsx
  • packages/base-ui/src/components/separator/Separator.module.css
  • packages/base-ui/src/components/separator/Separator.stories.tsx
  • packages/base-ui/src/components/separator/Separator.test.tsx
  • packages/base-ui/src/components/sheet/Sheet.module.css
  • packages/base-ui/src/components/sheet/Sheet.stories.tsx
  • packages/base-ui/src/components/sheet/Sheet.test.tsx
  • packages/base-ui/src/components/skeleton/Skeleton.module.css
  • packages/base-ui/src/components/skeleton/Skeleton.stories.tsx
  • packages/base-ui/src/components/skeleton/Skeleton.test.tsx
  • packages/base-ui/src/components/skeleton/Skeleton.tsx
  • packages/base-ui/src/components/slider/Slider.module.css
  • packages/base-ui/src/components/slider/Slider.stories.tsx
  • packages/base-ui/src/components/slider/Slider.test.tsx
  • packages/base-ui/src/components/spinner/Spinner.module.css
  • packages/base-ui/src/components/spinner/Spinner.stories.tsx
  • packages/base-ui/src/components/spinner/Spinner.test.tsx
  • packages/base-ui/src/components/split-button/SplitButton.module.css
  • packages/base-ui/src/components/split-button/SplitButton.stories.tsx
  • packages/base-ui/src/components/split-button/SplitButton.test.tsx
  • packages/base-ui/src/components/split-button/SplitButton.tsx
  • packages/base-ui/src/components/stat-row/StatRow.module.css
  • packages/base-ui/src/components/stat-row/StatRow.stories.tsx
  • packages/base-ui/src/components/stat-row/StatRow.test.tsx
  • packages/base-ui/src/components/status-bar/StatusBar.module.css
  • packages/base-ui/src/components/status-bar/StatusBar.stories.tsx
  • packages/base-ui/src/components/status-bar/StatusBar.test.tsx
  • packages/base-ui/src/components/status-dot/StatusDot.module.css
  • packages/base-ui/src/components/status-dot/StatusDot.stories.tsx
  • packages/base-ui/src/components/status-dot/StatusDot.test.tsx
  • packages/base-ui/src/components/status-dot/StatusDot.tsx
  • packages/base-ui/src/components/switch/Switch.module.css
  • packages/base-ui/src/components/switch/Switch.stories.tsx
  • packages/base-ui/src/components/switch/Switch.test.tsx
  • packages/base-ui/src/components/table/Table.module.css
  • packages/base-ui/src/components/table/Table.stories.tsx
  • packages/base-ui/src/components/table/Table.test.tsx
  • packages/base-ui/src/components/tabs/Tabs.module.css
  • packages/base-ui/src/components/tabs/Tabs.stories.tsx
  • packages/base-ui/src/components/tabs/Tabs.test.tsx
  • packages/base-ui/src/components/tabs/Tabs.tsx
  • packages/base-ui/src/components/tag-input/TagInput.module.css
  • packages/base-ui/src/components/tag-input/TagInput.stories.tsx
  • packages/base-ui/src/components/tag-input/TagInput.test.tsx
  • packages/base-ui/src/components/text-area/TextArea.module.css
  • packages/base-ui/src/components/text-area/TextArea.stories.tsx
  • packages/base-ui/src/components/text-area/TextArea.test.tsx
  • packages/base-ui/src/components/text-field/TextField.module.css
  • packages/base-ui/src/components/text-field/TextField.stories.tsx
  • packages/base-ui/src/components/text-field/TextField.test.tsx
  • packages/base-ui/src/components/timeline/Timeline.module.css
  • packages/base-ui/src/components/timeline/Timeline.stories.tsx
  • packages/base-ui/src/components/timeline/Timeline.test.tsx
  • packages/base-ui/src/components/toast/Toast.module.css
  • packages/base-ui/src/components/toggle-button-group/ToggleButtonGroup.stories.tsx
  • packages/base-ui/src/components/toggle-button/ToggleButton.module.css
  • packages/base-ui/src/components/toggle-button/ToggleButton.stories.tsx
  • packages/base-ui/src/components/toggle-button/ToggleButton.test.tsx
  • packages/base-ui/src/components/toolbar/Toolbar.module.css
  • packages/base-ui/src/components/toolbar/Toolbar.stories.tsx
  • packages/base-ui/src/components/toolbar/Toolbar.test.tsx
  • packages/base-ui/src/components/tooltip/Tooltip.module.css
  • packages/base-ui/src/components/tooltip/Tooltip.stories.tsx
  • packages/base-ui/src/components/tooltip/Tooltip.test.tsx
  • packages/base-ui/src/components/tree-list/TreeList.module.css
  • packages/base-ui/src/components/tree-list/TreeList.stories.tsx
  • packages/base-ui/src/components/tree-list/TreeList.test.tsx
  • packages/base-ui/src/components/typography/Blockquote.stories.tsx
  • packages/base-ui/src/components/typography/Caption.stories.tsx
  • packages/base-ui/src/components/typography/Code.stories.tsx
  • packages/base-ui/src/components/typography/Em.stories.tsx
  • packages/base-ui/src/components/typography/Heading.stories.tsx
  • packages/base-ui/src/components/typography/Hotkey.stories.tsx
  • packages/base-ui/src/components/typography/Link.stories.tsx
  • packages/base-ui/src/components/typography/Overline.stories.tsx
  • packages/base-ui/src/components/typography/Quote.stories.tsx
  • packages/base-ui/src/components/typography/Strong.stories.tsx
  • packages/base-ui/src/components/typography/Text.stories.tsx
  • packages/base-ui/src/components/typography/Underline.stories.tsx
  • packages/base-ui/src/system/types.ts
  • packages/base-ui/src/theme/styles.css

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/consistency-2
📝 Coding Plan
  • Generate coding plan for human review comments

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 and usage tips.

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Mar 18, 2026

Merging this PR will degrade performance by 21.99%

⚡ 2 improved benchmarks
❌ 2 regressed benchmarks
✅ 179 untouched benchmarks
⏩ 2 skipped benchmarks1

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
WallTime mount with 3 items 6.9 ms 6.1 ms +13.21%
WallTime mount 3.2 ms 3.8 ms -17.5%
WallTime open toggle 2.1 ms 2.7 ms -21.99%
WallTime mount 4.3 ms 3.9 ms +10.32%

Comparing feat/consistency-2 (e94cb4d) with main (e5e7f6a)

Open in CodSpeed

Footnotes

  1. 2 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

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.

1 participant