Unstyled, accessible Svelte 5 components with full keyboard navigation and WCAG 2.1 AA compliance
alus-ui is a monorepo containing:
packages/alus) - Unstyled, accessible UI components/) - Live demo and documentation site$props, $derived, $state)# Install the component library
npm install alus-ui
# or
pnpm add alus-ui
<script lang="ts">
import { Button, Input } from 'alus-ui';
let name = $state('');
</script>
<Input bind:value={name} placeholder="Enter your name" aria-label="Name input" />
<Button onclick={() => alert(`Hello ${name}!`)}>Submit</Button>
alus-svelte/
├── packages/
│ └── alus/ # Component library, published as `alus-ui`
│ ├── src/lib/
│ │ ├── components/ # UI components, by category
│ │ │ ├── form/ # Button, Input, Checkbox, Radio, …
│ │ │ ├── navigation/ # Tabs, Menu, Stepper, Breadcrumb, …
│ │ │ ├── feedback/ # Toast, Alert, Spinner, Progress, …
│ │ │ ├── display/ # Card, Avatar, Table, Timeline, …
│ │ │ ├── overlay/ # Modal, Drawer, Popover, Tooltip, …
│ │ │ ├── layout/ # Stack, Flex, Grid, Container, …
│ │ │ ├── interactive/ # Sortable, VirtualList, SplitView, …
│ │ │ └── utility/ # VisuallyHidden, Portal, FocusTrap, …
│ │ ├── utils/a11y/ # ARIA helpers, focus mgmt, IDs
│ │ ├── utils/form/ # Form field helpers
│ │ └── types/ # TypeScript types
│ ├── .release-it.json
│ ├── package.json
│ └── README.md
├── src/routes/ # Showcase app (SvelteKit)
├── docs/todos/ # Roadmap + a11y refactor plan
├── package.json # Root workspace
├── pnpm-workspace.yaml
└── CLAUDE.md # Project conventions
# Clone the repository
git clone https://github.com/Hanivan/alus.git
cd alus-svelte
# Install dependencies
pnpm install
# Start development servers
pnpm dev
This starts:
packages/alushttp://localhost:5173# Development
pnpm dev # Start both library and showcase
pnpm dev:showcase # Start only showcase app
cd packages/alus
pnpm dev # Start library watcher only
# Building
pnpm build # Build showcase app
cd packages/alus
pnpm build # Build library for publishing
# Testing
pnpm test # Run Vitest tests
pnpm test:unit # Run unit tests (alias for test)
# Code Quality
pnpm check # Type checking with svelte-check
pnpm lint # Lint with Prettier + ESLint
pnpm format # Format code with Prettier
The canonical export list lives in packages/alus/src/lib/components/index.ts. Demos for every component are in src/routes/components/{component}/+page.svelte.
Date components use @internationalized/date for locale, timezone, and non-Gregorian-calendar correctness.
alus-ui components are unstyled and designed to work with Tailwind CSS:
<script lang="ts">
import { Button } from 'alus-ui';
</script>
<!-- Primary button -->
<Button class="rounded bg-blue-600 px-4 py-2 text-white hover:bg-blue-700" aria-label="Submit form">
Submit
</Button>
<!-- Toggle button -->
<Button
class="rounded px-4 py-2 {active ? 'bg-green-600 text-white' : 'bg-gray-200 text-gray-700'}"
aria-pressed={active}
onclick={() => (active = !active)}
>
{active ? 'Active' : 'Inactive'}
</Button>
Every alus-ui component includes:
WCAG 2.1 AA compliant out of the box.
Contributions are welcome! Please see our contributing guidelines for details.
packages/alus/src/lib/components/src/routes/+page.sveltepnpm testSee Component Development for detailed guidelines.
# Run tests (Vitest)
pnpm test
# Type checking
pnpm check
# Linting
pnpm lint
The alus-ui package is published to npm from packages/alus/ via release-it with conventional-changelog. See packages/alus/README.md#releasing for the full workflow.
cd packages/alus
pnpm release:dry # preview bump, changelog, tag, publish
pnpm release # interactive
pnpm release:patch # 0.1.0 → 0.1.1
pnpm release:minor # 0.1.0 → 0.2.0
pnpm release:major # 0.1.0 → 1.0.0
Prereqs: clean main, npm whoami succeeds, GITHUB_TOKEN exported (else web fallback). The pipeline runs pnpm check, bumps version, runs pnpm build, writes CHANGELOG.md, commits, tags v<version>, pushes, creates the GitHub release, and runs npm publish.
MIT
Built with:
Note: This library is in active development. APIs may change before v1.0 release.
(^_^)b If you like this project, please consider giving it a star on GitHub!