diff --git a/dashboards/tracker-web/docs/roadmaps/UX_INTEGRATION_BYTELYST.md b/dashboards/tracker-web/docs/roadmaps/UX_INTEGRATION_BYTELYST.md index 16b777e6..1e15a888 100644 --- a/dashboards/tracker-web/docs/roadmaps/UX_INTEGRATION_BYTELYST.md +++ b/dashboards/tracker-web/docs/roadmaps/UX_INTEGRATION_BYTELYST.md @@ -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 diff --git a/dashboards/tracker-web/src/__tests__/primitives-adapter.exports.test.ts b/dashboards/tracker-web/src/__tests__/primitives-adapter.exports.test.ts new file mode 100644 index 00000000..231710cc --- /dev/null +++ b/dashboards/tracker-web/src/__tests__/primitives-adapter.exports.test.ts @@ -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)[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'); + }); +}); diff --git a/dashboards/tracker-web/src/components/ui/Primitives.tsx b/dashboards/tracker-web/src/components/ui/Primitives.tsx index 9ece0065..6a5db0f6 100644 --- a/dashboards/tracker-web/src/components/ui/Primitives.tsx +++ b/dashboards/tracker-web/src/components/ui/Primitives.tsx @@ -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';