feat(tracker-web): complete Primitives adapter + export-presence test (UX-9)

Extend src/components/ui/Primitives.tsx to re-export the shared @bytelyst/ui
controls later waves need (Select, Textarea, Checkbox, Switch, RadioGroup,
Tooltip, Tabs, SegmentedControl, DropdownMenu, Drawer, ActionMenu, IconButton,
AlertBanner, Card, Panel, Separator, DataList, Timeline), and add a pure
export-presence test that lifts the adapter off 0% coverage without a DOM dep.

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
saravanakumardb1 2026-05-28 20:37:28 -07:00
parent 3515fbddc5
commit 18a09b25b8
3 changed files with 191 additions and 4 deletions

View File

@ -175,14 +175,14 @@ pnpm build # final gate
> sits at **0% test coverage** (flagged in `docs/TEST_VALIDATION_LOG.md`). Broaden it and
> lock it with a cheap export-presence test — no `@testing-library/react`/jsdom needed.
- [ ] **9.1** Extend `Primitives.tsx` to also re-export the shared controls the app will need
- [x] **9.1** Extend `Primitives.tsx` to also re-export the shared controls the app will need
in later waves: `Select` `Textarea` `Checkbox` `Switch` `RadioGroup` `Tooltip` `Tabs`
`SegmentedControl` `DropdownMenu` `Drawer` `ActionMenu` `IconButton` `AlertBanner`
`Card` `Panel` `Separator` `DataList` `Timeline`. Keep app code importing only from the
adapter (preserves the UI-drift ratchet).
- [ ] **9.2** Add `src/__tests__/primitives-adapter.exports.test.ts` asserting every adapter
- [x] **9.2** Add `src/__tests__/primitives-adapter.exports.test.ts` asserting every adapter
export is `defined` (a pure import test — raises `Primitives.tsx` off 0% without a DOM dep).
**Verify:** `pnpm typecheck && pnpm lint && pnpm test && pnpm build`.
**Verify:** `pnpm typecheck && pnpm lint && pnpm test && pnpm build`. (UX-9 verified: tc/lint/test 159 ✓/build/e2e 18 ✓)
## UX-10 — Page chrome via `@bytelyst/dashboard-components`
@ -252,7 +252,7 @@ pnpm build # final gate
```
Core : UX-1 ✅ UX-2 ⬜ UX-3 ⬜ UX-4 ⬜ UX-5 ⬜ UX-6 ⬜ UX-7 ⬜ UX-8 ⬜
Expand : UX-9 UX-10 ⬜ UX-11 ⬜ UX-12 ⬜ UX-13 ⬜ (stretch: 12.3, 13.*)
Expand : UX-9 UX-10 ⬜ UX-11 ⬜ UX-12 ⬜ UX-13 ⬜ (stretch: 12.3, 13.*)
```
**UX-1 is done** (token bridge + Primitives adapter, commit `dc01dd02`) — the `--bl-*` bridge is

View File

@ -0,0 +1,98 @@
/**
* Export-presence test for the Primitives adapter (UX-9.2).
*
* A pure import test: it asserts every runtime (value) export of
* `src/components/ui/Primitives.tsx` is defined. This lifts the adapter off
* 0% coverage without needing `@testing-library/react` or a DOM environment,
* and guards against an accidental broken/renamed re-export from `@bytelyst/ui`.
*
* @see docs/roadmaps/UX_INTEGRATION_BYTELYST.md (UX-9)
*/
import { describe, it, expect } from 'vitest';
import * as Primitives from '@/components/ui/Primitives';
// Every value (non-type) export the adapter is expected to provide.
const EXPECTED_EXPORTS = [
// UX-1 baseline
'Button',
'Input',
'Field',
'FieldContent',
'FieldDescription',
'FieldError',
'FieldGroup',
'FieldLabel',
'FieldTitle',
'Modal',
'ConfirmDialog',
'Badge',
'StatusBadge',
'StatusDot',
'EmptyState',
'Skeleton',
'SkeletonGroup',
'TableSkeleton',
'MetricCard',
'Toast',
'ToastProvider',
'useToast',
'toast',
'dismissToast',
// UX-9.1 additions
'Select',
'Textarea',
'Checkbox',
'Switch',
'RadioGroup',
'RadioGroupItem',
'Tooltip',
'TooltipContent',
'TooltipProvider',
'TooltipTrigger',
'Tabs',
'TabsContent',
'TabsList',
'TabsTrigger',
'SegmentedControl',
'DropdownMenu',
'DropdownMenuContent',
'DropdownMenuGroup',
'DropdownMenuItem',
'DropdownMenuLabel',
'DropdownMenuRadioGroup',
'DropdownMenuSeparator',
'DropdownMenuSub',
'DropdownMenuSubTrigger',
'DropdownMenuTrigger',
'Drawer',
'ActionMenu',
'IconButton',
'AlertBanner',
'Card',
'CardHeader',
'CardTitle',
'CardDescription',
'Panel',
'PanelBody',
'PanelDescription',
'PanelHeader',
'PanelTitle',
'Separator',
'DataList',
'DataListItem',
'DataListMeta',
'Timeline',
] as const;
describe('Primitives adapter — export presence', () => {
it.each(EXPECTED_EXPORTS)('re-exports %s as a defined value', name => {
expect((Primitives as Record<string, unknown>)[name]).toBeDefined();
});
it('exposes the toast helpers as callable functions', () => {
expect(typeof Primitives.toast).toBe('function');
expect(typeof Primitives.dismissToast).toBe('function');
expect(typeof Primitives.useToast).toBe('function');
});
});

View File

@ -57,3 +57,92 @@ export {
dismissToast,
type ToastMessage,
} from '@bytelyst/ui';
// ── UX-9.1: broaden the adapter with the shared controls later waves need ──
// App code imports only from this adapter (preserves the UI-drift ratchet, CC.6).
export { Select, type SelectProps } from '@bytelyst/ui';
export { Textarea, type TextareaProps } from '@bytelyst/ui';
export { Checkbox, type CheckboxProps } from '@bytelyst/ui';
export { Switch, type SwitchProps } from '@bytelyst/ui';
export { RadioGroup, RadioGroupItem, type RadioGroupItemProps } from '@bytelyst/ui';
export {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
type TooltipContentProps,
} from '@bytelyst/ui';
export {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
type TabsContentProps,
type TabsListProps,
type TabsTriggerProps,
} from '@bytelyst/ui';
export {
SegmentedControl,
type SegmentedControlOption,
type SegmentedControlProps,
} from '@bytelyst/ui';
export {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuRadioGroup,
DropdownMenuSeparator,
DropdownMenuSub,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
type DropdownMenuContentProps,
type DropdownMenuItemProps,
type DropdownMenuLabelProps,
} from '@bytelyst/ui';
export { Drawer, type DrawerProps } from '@bytelyst/ui';
export { ActionMenu, type ActionMenuItem, type ActionMenuProps } from '@bytelyst/ui';
export { IconButton, type IconButtonProps } from '@bytelyst/ui';
export { AlertBanner, type AlertBannerProps, type AlertBannerTone } from '@bytelyst/ui';
export { Card, CardHeader, CardTitle, CardDescription, type CardProps } from '@bytelyst/ui';
export {
Panel,
PanelBody,
PanelDescription,
PanelHeader,
PanelTitle,
type PanelBodyProps,
type PanelDescriptionProps,
type PanelHeaderProps,
type PanelProps,
type PanelTitleProps,
} from '@bytelyst/ui';
export { Separator, type SeparatorProps } from '@bytelyst/ui';
export {
DataList,
DataListItem,
DataListMeta,
type DataListItemProps,
type DataListMetaProps,
type DataListProps,
} from '@bytelyst/ui';
export { Timeline, type TimelineItem, type TimelineProps } from '@bytelyst/ui';