Wave 9.D additions to the shared UI primitive package.
──────────────────────────────────────────────────────────────────
Skeleton — `card` shape added + new <SkeletonGroup> orchestrator
──────────────────────────────────────────────────────────────────
packages/ui/src/components/Skeleton.tsx
- 4 shape variants: text / block / circle / **card**
The `card` variant uses min-h-32 + rounded-2xl + a subtle
border so a real <Card> can swap in without CLS.
- New <SkeletonGroup loading fallback>{children}</SkeletonGroup>
component handles the fade-out → content swap centrally. Use
one per loadable region rather than sprinkling <Skeleton/>
everywhere. Supports `keepContent` for re-fetch flows.
- In-source TODO #2 marker for the pending vitest setup.
──────────────────────────────────────────────────────────────────
LoadingDots — three-dot inline pulse
──────────────────────────────────────────────────────────────────
packages/ui/src/components/LoadingDots.tsx (new)
- sm / md / lg sizes
- `color` override, defaults to var(--bl-accent)
- motion-safe:animate-bounce respects prefers-reduced-motion
- role="status" + sr-only label for screen readers
- inline-flex layout — composes inside chat bubbles + buttons
──────────────────────────────────────────────────────────────────
SearchInput — themed search field with suggestions slot
──────────────────────────────────────────────────────────────────
packages/ui/src/components/SearchInput.tsx (new)
- Leading Search icon + clear-x button (visible while value !== '')
- role="searchbox", proper aria-label fallback to placeholder
- 3 size scales matching ButtonSize convention
- `suggestions` slot for typeahead lists below
- Forwards ref to <input> for imperative focus
- Consolidates the bespoke search-field pattern from notes,
fastgap, voice, jarvisjr (roadmap §2.2).
──────────────────────────────────────────────────────────────────
Package hygiene
──────────────────────────────────────────────────────────────────
- package.json: 0.1.11 → 0.2.0
- tsconfig.json: added DOM + DOM.Iterable libs to match
motion/data-viz packages (required for e.target.value typing)
- src/index.ts: exported SkeletonGroup, LoadingDots, SearchInput
──────────────────────────────────────────────────────────────────
Quality gates
──────────────────────────────────────────────────────────────────
✓ tsc --noEmit clean
✓ tsc build clean (no errors)
✓ No regression to existing ui exports
──────────────────────────────────────────────────────────────────
Roadmap tracker — 5 boxes flipped (§11)
──────────────────────────────────────────────────────────────────
9.D.1 Skeleton extended with card shape
9.D.2 SkeletonGroup orchestrator
9.D.3 EmptyState verified (already shipped in 0.1.x)
9.D.4 SearchInput added
9.D.6 LoadingDots added + LoadingSpinner verified
§11.2 counter rewrote by scripts/count-roadmap-progress.ts:
Wave 9 Data: 0/42 → 5/42 (12%)
TOTAL: 5/202 → 10/202 (5%)
Open TODOs (§11.2.A):
#2 Add vitest + happy-dom + @testing-library/react to
@bytelyst/ui devDeps; write unit tests for the new
Skeleton/SkeletonGroup/LoadingDots/SearchInput surfaces.
#4 Republish @bytelyst/ui@0.2.0 to Gitea registry once #1
(publish workflow) closes.
Showcase demos for these primitives land in the next showcase
commit (9.D.7–9.D.9).
235 lines
6.9 KiB
JSON
235 lines
6.9 KiB
JSON
{
|
|
"name": "@bytelyst/ui",
|
|
"version": "0.2.0",
|
|
"type": "module",
|
|
"scripts": {
|
|
"storybook": "storybook dev -p 6006",
|
|
"build-storybook": "storybook build",
|
|
"build": "tsc"
|
|
},
|
|
"exports": {
|
|
".": {
|
|
"types": "./dist/index.d.ts",
|
|
"import": "./dist/index.js"
|
|
},
|
|
"./button": {
|
|
"types": "./dist/components/Button.d.ts",
|
|
"import": "./dist/components/Button.js"
|
|
},
|
|
"./card-button": {
|
|
"types": "./dist/components/CardButton.d.ts",
|
|
"import": "./dist/components/CardButton.js"
|
|
},
|
|
"./page-header": {
|
|
"types": "./dist/components/PageHeader.d.ts",
|
|
"import": "./dist/components/PageHeader.js"
|
|
},
|
|
"./section": {
|
|
"types": "./dist/components/Section.d.ts",
|
|
"import": "./dist/components/Section.js"
|
|
},
|
|
"./toolbar": {
|
|
"types": "./dist/components/Toolbar.d.ts",
|
|
"import": "./dist/components/Toolbar.js"
|
|
},
|
|
"./filter-bar": {
|
|
"types": "./dist/components/FilterBar.d.ts",
|
|
"import": "./dist/components/FilterBar.js"
|
|
},
|
|
"./form-section": {
|
|
"types": "./dist/components/FormSection.d.ts",
|
|
"import": "./dist/components/FormSection.js"
|
|
},
|
|
"./field-grid": {
|
|
"types": "./dist/components/FieldGrid.d.ts",
|
|
"import": "./dist/components/FieldGrid.js"
|
|
},
|
|
"./alert-banner": {
|
|
"types": "./dist/components/AlertBanner.d.ts",
|
|
"import": "./dist/components/AlertBanner.js"
|
|
},
|
|
"./skeleton": {
|
|
"types": "./dist/components/Skeleton.d.ts",
|
|
"import": "./dist/components/Skeleton.js"
|
|
},
|
|
"./entity-card": {
|
|
"types": "./dist/components/EntityCard.d.ts",
|
|
"import": "./dist/components/EntityCard.js"
|
|
},
|
|
"./metric-card": {
|
|
"types": "./dist/components/MetricCard.d.ts",
|
|
"import": "./dist/components/MetricCard.js"
|
|
},
|
|
"./action-menu": {
|
|
"types": "./dist/components/ActionMenu.d.ts",
|
|
"import": "./dist/components/ActionMenu.js"
|
|
},
|
|
"./drawer": {
|
|
"types": "./dist/components/Drawer.d.ts",
|
|
"import": "./dist/components/Drawer.js"
|
|
},
|
|
"./app-shell": {
|
|
"types": "./dist/components/AppShell.d.ts",
|
|
"import": "./dist/components/AppShell.js"
|
|
},
|
|
"./icon-button": {
|
|
"types": "./dist/components/IconButton.d.ts",
|
|
"import": "./dist/components/IconButton.js"
|
|
},
|
|
"./toast": {
|
|
"types": "./dist/components/Toast.d.ts",
|
|
"import": "./dist/components/Toast.js"
|
|
},
|
|
"./modal": {
|
|
"types": "./dist/components/Modal.d.ts",
|
|
"import": "./dist/components/Modal.js"
|
|
},
|
|
"./confirm-dialog": {
|
|
"types": "./dist/components/ConfirmDialog.d.ts",
|
|
"import": "./dist/components/ConfirmDialog.js"
|
|
},
|
|
"./badge": {
|
|
"types": "./dist/components/Badge.d.ts",
|
|
"import": "./dist/components/Badge.js"
|
|
},
|
|
"./status-badge": {
|
|
"types": "./dist/components/StatusBadge.d.ts",
|
|
"import": "./dist/components/StatusBadge.js"
|
|
},
|
|
"./empty-state": {
|
|
"types": "./dist/components/EmptyState.d.ts",
|
|
"import": "./dist/components/EmptyState.js"
|
|
},
|
|
"./input": {
|
|
"types": "./dist/components/Input.d.ts",
|
|
"import": "./dist/components/Input.js"
|
|
},
|
|
"./field": {
|
|
"types": "./dist/components/Field.d.ts",
|
|
"import": "./dist/components/Field.js"
|
|
},
|
|
"./textarea": {
|
|
"types": "./dist/components/Textarea.d.ts",
|
|
"import": "./dist/components/Textarea.js"
|
|
},
|
|
"./card": {
|
|
"types": "./dist/components/Card.d.ts",
|
|
"import": "./dist/components/Card.js"
|
|
},
|
|
"./panel": {
|
|
"types": "./dist/components/Panel.d.ts",
|
|
"import": "./dist/components/Panel.js"
|
|
},
|
|
"./surface": {
|
|
"types": "./dist/components/Surface.d.ts",
|
|
"import": "./dist/components/Surface.js"
|
|
},
|
|
"./list-item-button": {
|
|
"types": "./dist/components/ListItemButton.d.ts",
|
|
"import": "./dist/components/ListItemButton.js"
|
|
},
|
|
"./timeline": {
|
|
"types": "./dist/components/Timeline.d.ts",
|
|
"import": "./dist/components/Timeline.js"
|
|
},
|
|
"./diff-card": {
|
|
"types": "./dist/components/DiffCard.d.ts",
|
|
"import": "./dist/components/DiffCard.js"
|
|
},
|
|
"./label": {
|
|
"types": "./dist/components/Label.d.ts",
|
|
"import": "./dist/components/Label.js"
|
|
},
|
|
"./select": {
|
|
"types": "./dist/components/Select.d.ts",
|
|
"import": "./dist/components/Select.js"
|
|
},
|
|
"./tabs": {
|
|
"types": "./dist/components/Tabs.d.ts",
|
|
"import": "./dist/components/Tabs.js"
|
|
},
|
|
"./segmented-control": {
|
|
"types": "./dist/components/SegmentedControl.d.ts",
|
|
"import": "./dist/components/SegmentedControl.js"
|
|
},
|
|
"./tooltip": {
|
|
"types": "./dist/components/Tooltip.d.ts",
|
|
"import": "./dist/components/Tooltip.js"
|
|
},
|
|
"./dropdown-menu": {
|
|
"types": "./dist/components/DropdownMenu.d.ts",
|
|
"import": "./dist/components/DropdownMenu.js"
|
|
},
|
|
"./checkbox": {
|
|
"types": "./dist/components/Checkbox.d.ts",
|
|
"import": "./dist/components/Checkbox.js"
|
|
},
|
|
"./radio-group": {
|
|
"types": "./dist/components/RadioGroup.d.ts",
|
|
"import": "./dist/components/RadioGroup.js"
|
|
},
|
|
"./switch": {
|
|
"types": "./dist/components/Switch.d.ts",
|
|
"import": "./dist/components/Switch.js"
|
|
},
|
|
"./data-list": {
|
|
"types": "./dist/components/DataList.d.ts",
|
|
"import": "./dist/components/DataList.js"
|
|
},
|
|
"./data-table": {
|
|
"types": "./dist/components/DataTable.d.ts",
|
|
"import": "./dist/components/DataTable.js"
|
|
},
|
|
"./separator": {
|
|
"types": "./dist/components/Separator.d.ts",
|
|
"import": "./dist/components/Separator.js"
|
|
},
|
|
"./sidebar": {
|
|
"types": "./dist/components/Sidebar.d.ts",
|
|
"import": "./dist/components/Sidebar.js"
|
|
},
|
|
"./stat-card": {
|
|
"types": "./dist/components/StatCard.d.ts",
|
|
"import": "./dist/components/StatCard.js"
|
|
},
|
|
"./loading-spinner": {
|
|
"types": "./dist/components/LoadingSpinner.d.ts",
|
|
"import": "./dist/components/LoadingSpinner.js"
|
|
}
|
|
},
|
|
"peerDependencies": {
|
|
"react": "^18.0.0 || ^19.0.0",
|
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
},
|
|
"dependencies": {
|
|
"@radix-ui/react-alert-dialog": "^1.1.0",
|
|
"@radix-ui/react-checkbox": "^1.3.0",
|
|
"@radix-ui/react-dialog": "^1.1.0",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.0",
|
|
"@radix-ui/react-radio-group": "^1.3.0",
|
|
"@radix-ui/react-slot": "^1.1.0",
|
|
"@radix-ui/react-switch": "^1.2.0",
|
|
"@radix-ui/react-tabs": "^1.1.0",
|
|
"@radix-ui/react-tooltip": "^1.2.0",
|
|
"clsx": "^2.1.0",
|
|
"lucide-react": "^0.460.0"
|
|
},
|
|
"devDependencies": {
|
|
"@storybook/addon-a11y": "^8.5.0",
|
|
"@storybook/addon-essentials": "^8.5.0",
|
|
"@storybook/react": "^8.5.0",
|
|
"@storybook/react-vite": "^8.5.0",
|
|
"@types/react": "^19.0.0",
|
|
"@types/react-dom": "^19.0.0",
|
|
"storybook": "^8.5.0",
|
|
"typescript": "^5.7.0",
|
|
"vite": "^6.0.0"
|
|
},
|
|
"main": "./dist/index.js",
|
|
"types": "./dist/index.d.ts",
|
|
"files": [
|
|
"dist",
|
|
"README.md"
|
|
]
|
|
}
|