a13n
Build AI agents and run them on cloud.
Accessible web components, React wrappers and design tokens for Eduport products, with live examples and install instructions.
Developer toolsTypeScript · HTMLGitHub @ritwik-sbOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Eduport design system
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Live gallery · Storybook · npm
A reusable design system for Eduport products, in the spirit of IBM Carbon and the Atlassian Design System. Components are written once as web components and work in any framework, with React wrappers on top.
Status: pre-1.0. Packages are on npm at 0.x, so APIs may still change between minor versions. This repository holds the design tokens, a starter set of 18 components, and React wrappers for them.
Using an AI coding assistant? Point it at docs/llm-guide.md (or llms.txt). It has setup, every component API, the token rules and accessibility requirements in one file, plus a snippet to paste into your app's AGENTS.md or CLAUDE.md.
See every component: open the live gallery, with light/dark and soft/sharp switches and install steps. To run it locally with your own edits, use pnpm install && pnpm dev.
data-palette="sage"). The logo orange #fb6514 stays in the logo.@lit/react wrappers, so there's one codebase to maintain.| Package | What it is | Status |
|---|---|---|
@eduportdesign/tokens | Design tokens (color, type, space, radius, shadow, motion) as CSS variables, SCSS and JS | In this repo |
@eduportdesign/web-components | Lit 3 components (<ep-button>, <ep-text-field>, …) | In this repo |
@eduportdesign/react | React wrappers (<Button>, <TextField>, …) | In this repo |
@eduportdesign/logos | Eduport logo SVGs with a manifest of where to use each one | In this repo, not published yet |
@eduportdesign/icons | Icon package based on Tabler Icons | Planned |
The packages are published to two registries under the same version number. Use public npm unless you have a reason not to.
npm install @eduportdesign/tokens
No setup or login is needed.
GitHub Packages only accepts packages scoped to the repository owner, so there the tokens are published as @ritwik-sb/tokens. Install it under an alias so your imports still say @eduportdesign/tokens:
Create a GitHub personal access token (classic) with the read:packages scope.
Add an .npmrc next to your app's package.json:
@ritwik-sb:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}
Install with the alias:
npm install @eduportdesign/tokens@npm:@ritwik-sb/tokens
In CI, set GITHUB_TOKEN to a token that can read the package. In GitHub Actions, that's the built-in GITHUB_TOKEN with permissions: packages: read.
Import the CSS once, at your app's entry point:
import '@eduportdesign/tokens/css'; // primitives, light theme, soft corners
import '@eduportdesign/tokens/css/theme-dark'; // optional: dark theme
import '@eduportdesign/tokens/css/corners-sharp'; // optional: sharp corners
import '@eduportdesign/tokens/css/palette-sage'; // optional: the Sage & Sand palette (data-palette="sage")
import '@eduportdesign/tokens/css/style-playground'; // optional: the Playground style (data-style="playground")
import '@eduportdesign/tokens/css/base'; // recommended: body, headings, text, links, focus
Load the fonts too (npm install @fontsource-variable/onest @fontsource-variable/gabarito, then import both). Then pick the theme, palette and corner mode on the root element. All attributes are optional and can change at runtime:
<html data-theme="dark" data-palette="sage" data-corners="sharp">
Style your own UI with the semantic tokens:
.card {
background: var(--ep-color-surface-raised);
color: var(--ep-color-text-primary);
border-radius: var(--ep-radius-container);
}
Sass and JS are also available:
@use '@eduportdesign/tokens/scss' as ep;
import * as tokens from '@eduportdesign/tokens';
Components install the same way:
import '@eduportdesign/web-components'; // every component
import '@eduportdesign/web-components/components/button'; // or one at a time
import { Button, TextField } from '@eduportdesign/react';
<Button variant="primary" onClick={save}>Save</Button>
App shell (top bar, side nav, page header), Button, Icon button, Text field, Textarea, Select, Checkbox, Radio group, Switch, Date picker, Badge, Tag, Avatar, Card, Table, Icon, Accordion, Empty state, Skeleton, Tabs, Breadcrumbs, Pagination, Menu, Alert, Toast, Progress bar, Spinner, Tooltip, Popover and Modal. See packages/web-components for the tag names and APIs.
| Color | Two palettes on the same semantic tokens: Clay (default; coral key color, clay neutrals) and Sage & Sand (data-palette="sage"; sage key color, sand neutrals). Status and category hues (red, green, amber, blue, violet, teal, pink) are shared. Every pair is checked for WCAG AA in both palettes and both themes. |
| Type | Onest for UI text, Gabarito for headings, Noto Sans Malayalam for Malayalam, JetBrains Mono for code and IDs. Type roles (heading, body, label, code) set a whole text style in one token. |
| Radius | Semantic tokens indicator, control, container and round, set by the corner mode. |
| Density | Compact for mouse and trackpad, touch (44px controls, 16px input text) for phones and tablets. Touch turns on by itself on touch screens; data-density overrides it. |
| Spacing and layout | 4px-based space scale; a 4 / 8 / 12 column grid whose margin, gutter and section gap grow at the md (600px), lg (1024px) and xl (1440px) breakpoints. See docs/layout.md. |
| Motion | 100 / 200 / 300ms durations, enter offsets and a modal scale that drop to zero under reduced motion (the OS setting or data-motion="reduced"), so fades stay and nothing slides. Tooltips open after 500ms, button spinners wait 400ms, toasts stay 6s. See docs/motion.md. |
| Elevation and contrast | shadow.raised and shadow.overlay change with the theme, so surfaces still lift in dark. Increased contrast (the OS setting or ) strengthens dividers and outlines to 3:1. |
Components use semantic tokens for color, radius, control heights and icon sizes (--ep-color-text-primary, --ep-radius-control, --ep-size-control-md), never raw color or radius primitives. That rule is what makes themes, corner modes and touch density work. Fixed geometry that belongs to one component, like avatar diameters or the switch track, stays in that component.
The full reasoning, including the color tables and the contrast results, is in docs/foundations.md.
Requires Node 20 or later and pnpm (run corepack enable once to get the pinned version).
pnpm install
pnpm dev # component gallery at http://localhost:5173
pnpm storybook # Storybook at http://localhost:6006
pnpm build # writes packages/*/dist and builds the gallery and Storybook
pnpm test # contrast check, component tests and an axe check of every story
pnpm test runs the component tests (packages/web-components/test) and every Storybook story in headless Chromium, and fails on any axe accessibility violation. Run pnpm --filter @eduportdesign/web-components exec playwright install chromium once to get the browser.
apps/
gallery/ one page with every component (Vite)
storybook/ Storybook workbench with the accessibility addon
packages/
logos/ logo SVGs and logos.json (use cases)
tokens/ design tokens
web-components/ src/components/<name>/<name>.ts, index.ts (registers the tag)
react/ src/<name>.ts, one @lit/react wrapper per component
The gallery and Storybook read components from source, so edits show up straight away.
Token sources are DTCG JSON files:
packages/tokens/src/
primitives/ raw values: color scales, space, radius, type, shadow, motion
themes/ semantic colors: light.json, dark.json
corners/ semantic radius: soft.json, sharp.json
motion/ motion tokens with their reduced-motion values: full.json, reduced.json
To add a theme, add a JSON file to src/themes/. If a component needs a color that doesn't exist yet, add a semantic token to both light.json and dark.json and run the contrast check. Don't hard-code the value.
Versions are managed with Changesets. All @eduportdesign/* packages share one version number.
pnpm changeset and commits the file it creates.main, the Release workflow opens a Version packages PR that bumps versions and writes changelogs.Publishing only runs when the repository variable PUBLISH_ENABLED is true. Until then the workflow only opens Version PRs.
@eduportdesign/*. Custom elements use the ep- prefix and CSS custom properties use --ep-.forced-colors support, and AA contrast for every new color pair.MIT (planned; a LICENSE file hasn't been added yet).
data-contrast="more"| Icons | Tabler Icons (MIT, 5,000+ icons). |